uithread thread example asynctask java android multithreading performance android-handler

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