2016-12-04 6 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

関連する問題