2013-09-07 15 views
22

次のプログラムでハンドラを使用していますが、i = 5のときにハンドラを停止したいが、ハンドラが停止して連続して実行されないようにします。Handler Runnableを停止するには?

b1.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      handler = new Handler(); 
      runnable = new Runnable() { 
       public void run() { 

        try { 
         Toast.makeText(getApplicationContext(), "Handler is working", Toast.LENGTH_LONG).show(); 
         System.out.print("Handler is working"); 

         if(i==5){ 
          //Thread.currentThread().interrupt(); 
          handler.removeCallbacks(runnable); 


          System.out.print("ok"); 
             Toast.makeText(getApplicationContext(), "ok", Toast.LENGTH_LONG).show(); 
         } 
         i++; 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        handler.postDelayed(this, 5000); 

       } 
      }; 
      handler.postDelayed(runnable, 5000); 
      //return; 
     } 
    }); 
+0

あなたはすでにこの 'handler.removeCallbacks(runnable);'を持っています。http://developer.android.com/reference/android/os/Handler.html – Raghunandan

+0

あなたもカウントダウンを使うことができますタイマーのハンドラまたはタイマータスク – Raghunandan

+0

[ハンドラをキャンセルする、一時停止したプロセス]の複製が可能です(http://stackoverflow.com/questions/4378533/cancelling-a-handler-postdelayed-process) – Varun

答えて

17
protected void onStop() { 
    super.onStop(); 
    handler.removeCallbacks(runnable); 
} 

あなたがコールバックを削除した後、再びpostDelayed()を呼び出すため、この

29

のようにそれを停止することができます。このコードを使用してください:

final Handler handler = new Handler(); 
final Runnable runnable = new Runnable() { 
     public void run() { 
       Log.d("Runnable","Handler is working"); 
       if(i == 5){ // just remove call backs 
        handler.removeCallbacks(this); 
        Log.d("Runnable","ok"); 
       } else { // post again 
        i++; 
        handler.postDelayed(this, 5000); 
       } 
     } 
    }; 

//now somewhere in a method 
b1.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 
     handler.removeCallbacks(runnable); 
     handler.postDelayed(runnable, 5000); 
    } 
}); 
+0

あなたは以下のように書く:handler.postDelayed(runnable、5000); 2回 –

+0

@AjitDubeyあなたがよりよく理解するのに役立つ最新の編集かもしれない。 –

+0

@ M-WaJeEh-最初のpostDelayed(実行可能、5000)は5秒後に開始し、他の1つ(実行方法の内側)は5秒のカウント間隔を開始します。私は正しい? –

0

私のために働く解決策が見つかりました。私は活動の外であった場合でも、これは私がタイマ停止を期待するコードの例ですが、私はそれが生きていた見た:

boolean bFlagForceExit = false; 
Handler timerHandler = new Handler(); 
private Runnable timerRunnable = new Runnable() { 
    @Override 
    public void run() { 

     if (bFlagForceExit) 
    MyProcessForExit(); 

     if (bSomeflagForRunAction) 
      RunProcess(); 

     timerHandler.postDelayed(this, MILISEGUNDOS_ESPERA);  } 
}; 


private void MyProcessForExit() 
{ 
    timerHandler.removeCallbacks(timerRunnable); 
// close activity or whatever 
finish(); 
} 


private void RunProcess() 
{ 
    // action that i do when tick 
// time to leave or stop 
bFlagForceExit = true; 
} 

は、それから私は、removeCallbacks(timerRunnable)が 他のスレッドのために呼び出された場合、これが機能することを発見しましたですから、私はこのような問題を解決しました。

boolean bFlagForceExit = false; 
Handler timerHandler = new Handler(); 
private Runnable timerRunnable = new Runnable() { 
    @Override 
    public void run() { 

     if (bFlagForceExit) 
     { 
    // add a thred for run your stop handler 
      new Thread(new Runnable() { 
       public void run() { 
        SalirDeProceso(); 
       } 
      }).start(); 
     } 

     if (bSomeflagForRunAction) 
      RUnProcess(); 

     timerHandler.postDelayed(this, MILISEGUNDOS_ESPERA);  } 
}; 
0

「i」が初期化されている場所は表示されません。おそらくそれは決して<5です。

関連する問題