如何在Android中停止Handler?

时间:2011-04-28 13:10:36

标签: 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);

6 个答案:

答案 0 :(得分:61)

听起来这个活动在Handler执行代码之前完成了它的生命周期。您可以通过为处理程序和runnable创建实例成员来管理handler.post(runnable),然后在Activity Lifecycle方法中管理处理程序。

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

使用handler.post启动runnable。

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

}

如果在调用onStop时没有执行runnable,我们不想运行它。 删除onStop方法中的回调:

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

答案 1 :(得分:10)

考虑:

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 :(得分:10)

答案 3 :(得分:6)

它永远不会停止,因为你总是在发送消息!我想你要删除handler.sendEmptyMessageDelayed(0,0000);,这实际上没有意义(你是否将消息延迟0毫秒?)。

答案 4 :(得分:5)

Handler只是一个线程事件循环的接口。因此,如果你停止线程,那么你“停止”处理程序。

假设您的处理程序是用于后台线程。

这是一个示例,其中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's 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();
        }
    }
}

因此,在Activity的onPause()或onStop()方法中,只需调用myThread.quit()。

答案 5 :(得分:4)

只要Looper实例处于活动状态,您的处理程序(如果实现的话)将处于活动状态,这对于线程的整个生命周期(与活动生命周期几乎没有关系)。

如果您希望处理程序停止重新触发,您需要自己处理它。

无论如何,向自己发送0延迟的消息看起来有些奇怪。实际上你想要实现什么目标?