Как остановить 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);
Ответы
Ответ 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);
}
Ответ 3
используйте removeCallbacks или removeCallbacksAndMessages
Ответ 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-задержкой для себя выглядит немного странно. Чего вы на самом деле пытаетесь достичь?