2014-06-09 5 views
1

버튼을 초 동안 녹색으로 설정하고 다시 빨간색으로 설정하려고합니다. 그러나 그것은 더 이상 녹색으로 바뀌지 않을 것입니다. "빨간색으로 변경"부분을 주석 처리하면 녹색으로 잘 전환됩니다. 나는 Log.d을 사용했으며 "녹색으로 변경"에서 "빨간색으로 변경"사이의 두 번째 차이점이 있음을 보여 주므로 빨간색으로 표시되기 전에 초록색을보아야하지만 어떤 이유로이 기능이 작동하지 않습니다.안드로이드 - 백그라운드 리소스를 두 번씩 변경하십시오.

어떤 아이디어?

public void level1() throws InterruptedException { 
    int Low = 1000; 
    int High = 3000; 
    int t = r.nextInt(High-Low) + Low; 
    Thread.sleep(t); 
    handleTime.post(new Runnable() { 
     @Override 
     public void run() { 
      int i = r.nextInt(5); 
      switch(i) { 
      case 1: 
       try { 
        setGreen(tLeft); 
        tLActive = true; 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } finally { 
        tLActive = false; 
        setRed(tLeft); 
       } 
       break; 
      case 2: 
       try { 
        setGreen(tRight); 
        tRActive = true; 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } finally { 
        tRActive = false; 
        setRed(tRight); 
       } 
       break; 
      case 3: 
       try { 
        setGreen(center); 
        cActive = true; 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } finally { 
        cActive = false; 
        setRed(center); 
       } 
       break; 
      case 4: 
       try { 
        setGreen(bLeft); 
        bLActive = true; 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } finally { 
        bLActive = false; 
        setRed(bLeft); 
       } 
       break; 
      case 5: 
       try { 
        setGreen(bRight); 
        bRActive = true; 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } finally { 
        bRActive = false; 
        setRed(bRight); 
       } 
       break; 
      } 
     } 
    }); 
} 

private void setGreen(ImageButton b) { 
    b.setBackgroundResource(R.drawable.green); 
    Log.d("green", "green"); 
} 

private void setRed(ImageButton b) { 
    b.setBackgroundResource(R.drawable.red); 
    Log.d("red", "red"); 
} 

답변

1

당신은 할 수 Handler.class

으로 간단한 예제를 사용합니다 :

postDelayed가 UI 스레드에서 호출 될
setGreenColor(); 
Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
    setRedColor(); 
    } 
}, 1000); 

.

+1

그래, 당신은'handleTime'을 다시 사용할 수 있습니다. – weston

0

이 경우 Runnable은 UI 스레드에서 실행됩니다. 묘화를 담당하는 thread와 같은 thread. 그러나 그리기가 즉시 실행되는 대신 UI 요소가 다시 그리기를 원하기 때문에 UI 요소가 무효화되고 UI 스레드에 시간이 있으면 다시 그리기를 수행합니다. 엘다 Mensutov로서

{ //the essence of the runnable code 
    setGreen(bRight); //UI element is invalidated, it wants to be redrawn green 
    Thread.sleep(1000); //UI thread is tied up here (blocked) so nothing can happen on UI 
    setRed(bRight); //UI element is invalidated again, it wants to be redrawn red now 
        // replacing the green before it's even been seen 
} //end of runnable code 
//now the redrawing occurs, and it will only be red. 

한 용액을 다른 실행 가능한 지연을 배치하는 지적한다. 그러면 UI 스레드는 Thread.sleep에 의해 차단되지 않습니다.

+0

반드시 'setRed'를 마침내 괄호에 넣으면 녹색으로 먼저 그려집니다. –

+0

아니요, 'finally'는 '예외가 발생했는지 또는 나중에 예외가 발생하는지 확인하지 않은 경우'를 의미합니다. – weston