studio programacion herramientas fundamentos con avanzado aplicaciones android runnable

programacion - Android: ¿cómo puedo detener Runnable?



manual de android en pdf (4)

Lo intenté 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() !


En su lugar, implemente su propio mecanismo thread.kill() , utilizando la API existente provista por el SDK. Administre su creación de subprocesos dentro de un threadpool y use Future.cancel() para eliminar 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 manera diferente en función de su estado de ejecución de tareas, consulte la API para obtener más detalles.


changeColor se declara Runnable , que no tiene un método kill() .

Necesita crear su propia interfaz que amplíe Runnable y agregue un método (público) kill() .


mHandler.removeCallbacks(updateThread);


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