2016-12-04 1 views
1

나는이 스레드 시작 ... 3 2 ... 1을 표시하는 다음 코드를어떻게 일시 정지/다시 시작 또는 스레드를 중지하고 팝업을 표시

... 
final Handler handler = new Handler(); 
final TextView textView = (TextView) findViewById(R.id.textView2); 
final java.util.concurrent.atomic.AtomicInteger n = new AtomicInteger(3); 
final Runnable counter = new Runnable() { 
    @Override 
    public void run() { 
     textView.setText(Integer.toString(n.get())); 
     if(n.getAndDecrement() >= 1) 
      handler.postDelayed(this, 1000); 
     else { 
      textView.setVisibility(View.GONE); 
      tv.post(new Roller(900)); //tv is a textView 
     } 
    } 
}; 
handler.postDelayed(counter, 1000); 
... 
ImageButton ibStop; 
ibStop.setOnClickListener(...() { 
    //stop the thread 
    //display a popup 
}); 

ImageButton ibPause; 
ibPause.setOnClickListener(...() { 
    //pause the thread 
    //display a popup 
}); 

ImageButton ibPlay; 
ibPlay.setOnClickListener(...() { 
    //display the `handler` above with the 3...2...1... 
    //resume the thread 
}); 

의 Runnable :

private class Roller implements Runnable 
{ 
    private long delayMillis; 
    private Boolean stop = false; 

    public Roller(long delayMillis) 
    { 
     this.delayMillis = delayMillis; 
    } 

    @Override 
    public void run() 
    { 
     int min = 0; 
     int max = 1; 
     int n = rand.nextInt(max - min + 1) + min; 
     String roll = String.valueOf(n); 
     tv.setText("Random number is " + roll); //tv is a textview 

     if (roll.equals("0")) { 
      inType = 0; 
      ibRed.setImageResource(R.drawable.red_selector); 
      ibGreen.setImageResource(R.drawable.green_dark); 
     } 
     if (roll.equals("1")) { 
      inType = 1; 
      ibRed.setImageResource(R.drawable.red_dark); 
      ibGreen.setImageResource(R.drawable.green_selector); 
     } 

     tv.postDelayed(this, delayMillis); 
    } 
} 

스레드를 중지하고 일시 중지/다시 시작하도록 도와주세요.

+0

일시 중지하거나 계속 실행하려면 플래그 변수를 넣고 변경해야합니다. – Alon

답변

3

@Alon이 제안했듯이, 실행 파일을 일시 중지했다가 다시 시작하기 위해 변경하려면 플래그 변수가 필요할 수 있습니다. 특히 당신은 처리기로 안드로이드의 메시징 시스템을 사용하려고 시도 할 수 있습니다. 이것은 "이상적인 방법"이지만 스레드 실행 가능한 상태를 관리 할 수 ​​

boolean mRunning; int AYE_AYE_CAPTAIN=4; int MESSAGE_PAUSE=3; 
    int MESSAGE_RESUME=2; 
    Runnable roller = new Runnable() { 
      @Override 
      public void run() { 
       while(mRunning) { 
        try { 
         // Do your stuff here. 
         /* In case you want to communicate with handler */ 
         Message msg = new Message(); 
         msg.what=AYE_AYE_CAPTAIN; 
         handler.sendMessage(msg); 
        } catch (InterruptedException e) { 
         // Not good!!! 
        } 
       } 
      } 
     }, timeToRun,this); 

     mRunning=true; 
     roller.start(); 

그리고 핸들러 :) 과거에 나를 위해 일한 것 확실하지.

/** Handler to keep track of and manage thread runnable state */ 
    handler = new Handler(Looper.getMainLooper()){ 

      @Override 
      public void handleMessage(Message msg) { 
       super.handleMessage(msg); 

       switch (msg.what) { 
        case MESSAGE_PAUSE: 
         // Take an action 
         mRunning=false; 
         break; 
        case MESSAGE_RESUME; 
         mRunning = true; 
         // Restart Runnable here. 
         roller.start(); 
         break; 
        default: 
         break; 
       } 
      } 
     }; 

그런 다음 메시지를 통해 일시 중지 또는 다시 시작 옵션을 수행하십시오.

public void main sendLifeCycleMessage(int MESSAGE) { 
    Message awesomeMessage = new Message(); 

    awesomeMessage.what = MESSAGE; // 
    roller.sendMessage(awesomeMessage); 
    /* alternatively if your calling from a service: 
    mService.getHandler().sendMessage(awesomeMessage); 
    */ 
+0

활동에 어떻게 추가됩니까? – Si8

+0

질문에 대한 답변을 모르겠습니다. – Rob

+0

코드에서 코드를 어떻게 포맷합니까? – Si8

관련 문제