java - thread - ¿Cómo detener Handler Runnable?
handler thread android example (4)
Encontré una solución que funciona para mí. Este es un ejemplo de código, donde espero que se detenga el temporizador, pero vi que estaba vivo, incluso si estaba fuera de actividad:
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;
}
Luego descubrí que esto funciona si se removeCallbacks(timerRunnable)
para otros subprocesos, así que resolví el problema de esta manera.
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); }
};
Estoy usando un controlador en el siguiente programa y quiero detenerlo cuando i = 5, pero el controlador no se detiene y se ejecuta continuamente.
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;
}
});
No muestra donde se inicializa "i". Tal vez nunca sea <5.
Porque llamas a postDelayed()
nuevamente después de eliminar las postDelayed()
llamadas. Por favor use este código:
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);
}
});
protected void onStop() {
super.onStop();
handler.removeCallbacks(runnable);
}
puedes pararlo asi