2013-09-07 10 views
22

Ich verwende einen Handler im folgenden Programm und ich möchte es stoppen, wenn i = 5, aber der Handler nicht stoppen und kontinuierlich ausgeführt werden.Wie Handler Runnable zu stoppen?

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

Sie haben bereits diese 'handler.removeCallbacks (runnable);' http://developer.android.com/reference/android/os/Handler.html – Raghunandan

+0

können Sie auch einen Countdown verwenden timer a handler oder timer task – Raghunandan

+0

möglich duplikat von [cancelling a handler.postdelayed process] (http://stackoverflow.com/questions/4378533/cancelling-a-handler-postdelayed-process) – Varun

Antwort

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

können Sie es wie diese

29

stoppen Weil Sie postDelayed() wieder rufen nach Rückrufe zu entfernen. Bitte verwenden Sie diesen Code:

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

kannst du bitte einfach erklären wieso Sie schreiben handler.postDelayed (runnable, 5000); zweimal –

+0

@AjitDubey Mai neueste Bearbeitung wird Ihnen helfen, besser zu verstehen. –

+0

@ M-WaJeEh- Wie ich verstehe, zuerst postDelayed (runnable, 5000) wird nach 5 Sek. Starten und andere (die in Run-Methode ist) Start Zählintervall von 5 Sek. habe ich recht? –

0

Ich fand eine Lösung, die für mich funktioniert. Dies ist ein Beispiel für Code, wo ich einen Timer Stop erwarten, aber ich sah es war am Leben, auch wenn ich aus der Tätigkeit war:

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; 
} 

Dann fand ich, dass dies funktioniert, wenn removeCallbacks(timerRunnable) für andere Threads aufgerufen wurde Also habe ich das Problem so gelöst.

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

Sie zeigen nicht an, wo "i" initialisiert wird. Vielleicht ist es nie < 5.