2012-06-29 3 views
0

무작위로 표시하고 몇 초 후에 사라지는 버튼이 몇 개 있습니다. 또한 변경 사항이있는 경우 표시 될 때 클릭 할 수있게하려고합니다. .? Android에서 몇 초 후에 버튼이 나타나고 사라집니다.

public void fight() throws InterruptedException 
{ 
    Random g = new Random(); 
    int move; 
    for(int i = 0; i <= 3; i++) 
    { 
     move = g.nextInt(8); 
     buttons[move].setVisibility(View.VISIBLE); 
     buttons[move].setClickable(true); 

     try{ Thread.sleep(5000); }catch(InterruptedException e){ } 

     buttons[move].setVisibility(View.GONE); 
     buttons[move].setClickable(false); 
    } 

} 

그래도 난, 모든 것이 그냥 루프를 통해 때마다 20 초 (아마 5 초 동안 정지하고 아무것도 어떤 아이디어 일이 없다는 것을 시도

: 여기

내가 가진 무엇

감사합니다.

+1

UI 스레드를 잠 그어 있기 때문에 얼어 버립니다. 백그라운드 스레드에서 타이머를 실행하고 콜백에서 버튼을 숨 깁니다. 내장 Timer 클래스 (http://developer.android.com/reference/java/util/Timer.html) – xbonez

+0

예를 참조하십시오. 나는 그것의 작업으로'Timer'를 사용하거나 지연된 Runnables로'Handler'를 사용하여 확실히 구현할 것입니다. – davidcesarino

+0

Timer를 사용하려고했지만 다음 오류 메시지가 나타납니다. CalledFromWrongThreadException : 뷰 계층 구조를 만든 원래 스레드 만 뷰를 만질 수 있습니다. – SpyMachine

답변

0

public void fight() throws InterruptedException 
{ 
    Random g = new Random(); 
    int move; 
    runOnUiThread(new Runnable() 
    { 
     public void run() { 
      while(makeACondition) { 
      move = g.nextInt(8); 
      buttons[move].setVisibility(View.VISIBLE); 
      buttons[move].setClickable(true); 

      if (System.currentTimeMillis() % 5000 == 0) { 

       buttons[move].setVisibility(View.GONE); 
       buttons[move].setClickable(false); 
      } 
      } 
     } 
    } 

} 
+0

방금 ​​그들 모두가 즉시 나타났습니다. 또한, 편집과 마찬가지로'System.currentTimeMillis()'입니다. – SpyMachine

+0

업데이트 됨, 시도해보십시오. –

+0

은 여전히 ​​동일한 작업을 수행합니다. – SpyMachine

0
private Handler mMessageHandler = new Handler(); 
Random g = new Random(); 
int move; 

private Runnable mUpdaterRunnable = new Runnable() { 
    public void run() { 
     // hide current button 
     buttons[move].setVisibility(View.INVISIBLE); 
     // set next button 
     move = g.nextInt(8); 
     // show next button 
     buttons[move].setVisibility(View.VISIBLE); 

     // repeat after 5 seconds 
     mMessageHandler.postDelayed(mUpdaterRunnable, 5000); 
    } 
}; 
시도

시작하려면 move = g.nextInt(8); (null을 방지하기 위해)과 mMessageHandler.post(mUpdaterRunnable);을 사용하십시오.

중지하려면 mMessageHandler.removeCallbacks(mUpdaterRunnable);.

TimerTimerTask으로 설정하면 xbonez가 말한 것처럼이 작업을 수행 할 수도 있습니다.

+0

'mMessageHandler.postDelayed (mUpdaterRunnable, 5000);에서''mUpdaterRunnable'은''mUpdaterRunnable 로컬 변수가 초기화되지 않았을 수 있습니다. 어떤 생각? – SpyMachine

+0

불가능합니다. 클래스 정의에서'mUpdaterRunnable'을 전역 적으로 정의했다면 이미 초기화되었을 것입니다. 너는 너의 편에서 뭔가 잘못하고있어. – davidcesarino

0

이 방법을 시도해 보셨습니까?

private int move; 
public void fight() throws InterruptedException 
{ 
    final Random g = new Random(); 
    runOnUiThread(new Runnable() 
    { 
     public void run() { 
      while(makeACondition) { 
      move = g.nextInt(8); 

      toggleButtonState(buttons[move]); 
      } 
     } 
    }); 
} 

private void toggleButtonState(final Button button) 
{ 
    new Handler().postDelayed(new Runnable() { 

     @Override 
     public void run() { 
      if(button.isEnabled()) 
       button.setVisibility(View.GONE); 
      else 
       button.setVisibility(View.VISIBLE); 

     } 
    }, 5000); 

} 
+0

이것을 테스트 할 수 있었습니까? – sunil

관련 문제