Android: ¿Cómo puedo detener Runnable?
He intentado de esta manera:
private Runnable changeColor = new Runnable() { private boolean killMe=false; public void run() { //some work if(!killMe) color_changer.postDelayed(changeColor, 150); } public void kill(){ killMe=true; } };
Pero no puedo acceder al método kill()
!
- Cómo pasar o asignar un valor obtenido en un runOnUiThread
- ¿Existe ya una clase StopWatch para android y por qué no funciona mi implementación?
- Cómo implementar una cola de runnables
- Actualizar la interfaz de usuario de Android desde un subproceso de otra clase
- Una pregunta sobre Android runnable
- Android: obtenga tiempo hasta que Runnable se ejecute a través de Handler
- Actualización de la interfaz de usuario desde un servicio (mediante un controlador?)
- El hilo no interrumpe
- Android OpenGL gameloop fuera de OnFrame
- Problema al descargar la imagen y actualizar la listaVista
- Android: Múltiples temporizadores en un ListView con manejador y ejecutables. 2 Problemas
- Tomando un cómputo pesado del subproceso de la interfaz de usuario de Android
- RemoveCallbacks no se detiene runnable
En su lugar implementar su propio mecanismo thread.kill()
, utilizando la API existente proporcionada por el SDK. Administre su creación de subprocesos dentro de un subproceso y utilice Future.cancel () para matar el subproceso en ejecución:
ExecutorService threadPoolExecutor = Executors.newSingleThreadExecutor(); Runnable longRunningTask = new Runnable(); // submit task to threadpool: Future longRunningTaskFuture = threadPoolExecutor.submit(longRunningTask); ... ... // At some point in the future, if you want to kill the task: longRunningTaskFuture.cancel(true); ... ...
El método de cancelación se comportará de forma diferente en función del estado de ejecución de la tarea, consulte la API para obtener más detalles.
public abstract class StoppableRunnable implements Runnable { private volatile boolean mIsStopped = false; public abstract void stoppableRun(); public void run() { setStopped(false); while(!mIsStopped) { stoppableRun(); stop(); } } public boolean isStopped() { return mIsStopped; } private void setStopped(boolean isStop) { if (mIsStopped != isStop) mIsStopped = isStop; } public void stop() { setStopped(true); } }
clase ……
private Handler mHandler = new Handler(); public void onStopThread() { mTask.stop(); mHandler.removeCallbacks(mTask); } public void onStartThread(long delayMillis) { mHandler.postDelayed(mTask, delayMillis); } private StoppableRunnable mTask = new StoppableRunnable() { public void stoppableRun() { ..... onStartThread(1000); } } };
mHandler.removeCallbacks(updateThread);
changeColor
se declara como Runnable
, que no tiene un método kill()
.
Necesitas crear tu propia interfaz que extiende Runnable
y agrega un método (public) kill()
.