Стоп обработчик в 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.

Другие вопросы по тегам