Подтвердить что ты не робот

Как остановить Handler в Android?

В моем приложении мой обработчик не останавливается. Как остановить обработчик?
Он продолжает начинаться после закрытия операции. Что я могу сделать?

код:

 handler = new Handler()
        {
            @Override
            public void handleMessage(Message msg) 
            {
                // TODO Auto-generated method stub
                super.handleMessage(msg);
                if(i<max)
                {
                    evnetChangedisplay(i);
                    i++;
                        handler.sendEmptyMessageDelayed(0, 5000);
                    }
                else
                    {
                        i = 0;
                        handler.sendEmptyMessageDelayed(0,0000);
                    }
                }
        };
handler.sendEmptyMessageDelayed(0,000);
4b9b3361

Ответ 1

Рассмотрим:

private Handler myHandler= new Handler(){
        @Override
        public void  handleMessage(Message msg){        
            switch(msg.what){
                case 0:
                    this.removeMessages(0);
                    messageSendingCodeWhat0();
                 break;
                default:
                    super.handleMessage(msg);
                    break;
            }
        }
    };

Ответ 2

Похоже, что действие завершает жизненный цикл, прежде чем обработчик выполнит этот код. Вы можете управлять обработчиком handler.post(runnable), создав элемент-экземпляр для обработчика и выполнимый, а затем управляя обработчиком в методах жизненного цикла активности.

private Handler myHandler;
private Runnable myRunnable = new Runnable() {
    @Override
    public void run() {
        //Do Something
    }
};

Запустите runnable с помощью handler.post.

protected void onStart() {
    super.onStart();
    myHandler = new Handler();
    myHandler.post(myRunnable);

}

Если runnable не был выполнен к моменту вызова onStop, мы не хотим его запускать. Удалите обратный вызов в методе onStop:

protected void onStop() {
    super.onStop();
    mHandler.removeCallbacks(myRunnable);
}

Ответ 4

Он никогда не останавливается, потому что вы всегда отправляете сообщение! Я думаю, вы хотите удалить handler.sendEmptyMessageDelayed(0,0000);, что на самом деле не имеет смысла (вы задерживаете сообщение 0 миллисекунд?).

Ответ 5

Обработчик - это просто интерфейс к циклу событий потока. Поэтому, если вы остановите поток, вы остановите обработчик.

предполагая, что ваш обработчик предназначен для фонового потока.

Здесь пример, где quit() предназначен для отправки метода looper.quit() в цикл событий, который остановит поток и обработчик.

public class MyThread extends Thread 
{
    private Handler m_handler;

    @Override
    public void run()
    {
        Looper.prepare();
        m_handler = new Handler();
        Looper.loop();
    }

    // Simply post the quit runnable to the thread event loop
    public void quit()
    {
        m_handler.post(new QuitLooper());
    }

    // Inner Runnable which can be posted to the handler
    class QuitLooper implements Runnable
    {
        @Override
        public void run() 
        {
            Looper.myLooper().quit();
        }
    }
}

Поэтому в своих действиях onPause() или onStop() просто вызывайте myThread.quit().

Ответ 6

Ваш обработчик (если он реализован так) будет активным до тех пор, пока активен экземпляр Looper, который предназначен для всего жизненного цикла потока (что мало связано с жизненным циклом активности).

Если вы хотите, чтобы обработчик прекратил повторное запуск, вам нужно позаботиться о нем сами.

Отправка сообщения с 0-задержкой для себя выглядит немного странно. Чего вы на самом деле пытаетесь достичь?