Android: Как остановить Runnable?
Я пробовал этот путь:
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;
}
};
но я не могу получить доступ к методу kill()
!
Ответы
Ответ 1
Вместо этого реализуйте свой собственный механизм thread.kill()
, используя существующий API, предоставляемый SDK. Управляйте созданием потока в пуле потоков и используйте Future.cancel(), чтобы уничтожить работающий поток:
ExecutorService executorService = Executors.newSingleThreadExecutor();
Runnable longRunningTask = new Runnable();
// submit task to threadpool:
Future longRunningTaskFuture = executorService.submit(longRunningTask);
... ...
// At some point in the future, if you want to kill the task:
longRunningTaskFuture.cancel(true);
... ...
Метод отмены будет вести себя по-разному в зависимости от состояния выполнения задачи, для получения более подробной информации обратитесь к API.
Ответ 2
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);
}
}
класс......
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);
}
}
};
Ответ 3
mHandler.removeCallbacks(updateThread);
Ответ 4
changeColor
объявляется как Runnable
, который не имеет метода kill()
.
Вам нужно создать свой собственный интерфейс, который расширяет Runnable
и добавляет метод (public) kill()
.
Ответ 5
Вы можете использовать этот способ
Остановить выполняемую тему
//================================================ ==============================
ThreadUtil.startTask(() -> {
// doTask
}, 1500);
//==============================================================================
public class ThreadUtil {
private static Handler handler;
private static Runnable runnable;
public static void startTask(IThreadTask iThreadTask, long delayTime) {
stopTask();
handler = new Handler();
runnable = () -> {
iThreadTask.doTask();
};
if (handler == null || runnable == null) {
return;
}
handler.postDelayed(runnable, delayTime);
}
public static void stopTask() {
try {
handler.removeCallbacks(runnable);
handler.removeCallbacksAndMessages(null);
handler = null;
runnable = null;
}catch (Exception e){
Log.e("ThreadUtil:","Error:"+e.toString());
}
}
public interface IThreadTask {
void doTask();
}
}