Стоп обработчик в Android не работает
У меня есть этот обработчик:
private Runnable mRunnableReset = new Runnable() {
public void run() {
Log.i("MyApp", "mRunnableReset");
}
};
private Handler mHandler = new Handler();
private Runnable mRunnable = new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(2000);
mHandler.post(mRunnableReset);
} catch (Exception e) {
// TODO: handle exception
}
}
}
};
Я пытался использовать этот код в моем методе onDestroy()
mHandler.removeCallbacks(mRunnableReset);
mHandler.removeCallbacksAndMessages(null);
но mRunnable все еще работает (я вижу журнал в LogCat). Если я использую mRunnable.destroy(), мое приложение вылетает.
Как я могу остановить это? Спасибо.
2 ответа
Решение
Вместо того, чтобы использовать Thread.sleep()
использование postDelayed()
при публикации вашего Runnable (вместо обычного post()
).
К сожалению, вы используете
while(true){
Thread.sleep(2000);
mHandler.post(mRunnableReset);
}
Как это остановится тогда? Не будет
Вместо этого должно быть как,
private Runnable mRunnableReset = new Runnable() {
public void run() {
Log.i("MyApp", "mRunnableReset");
mHandler.removeCallbacks(mRunnableReset);
mHandler.post(mRunnableReset);
}
};
private Handler mHandler = new Handler();
private Runnable mRunnable = new Runnable() {
public void run() {
try {
Thread.sleep(2000);
mHandler.post(mRunnableReset);
} catch (Exception e) {
// TODO: handle exception
}
}
};
А потом остановить mRunnableReset
использование mHandler.removeCallbacks(mRunnableReset);
А лучше бы использовать mHandler.postDelayed(mRunnableReset, 2000)
вместо Thread.sleep(2000);
Также проверьте мой ответ здесь, чтобы получить полное представление о том, как будет работать Handler.