2011-04-28 182 views
30

在我的应用程序中,我的处理程序不停止。我怎样才能阻止处理程序?
它在关闭活动后继续开始。我能做什么?如何在Android中停止Handler?

代码:

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); 
+0

你是什么意思“我的处理程序不停止”?你怎么理解这一点? – 2011-04-28 13:15:54

+0

它的运行,因为我在DDMS..by SYstem.out.println显示..它继续运行在我的应用程序.. – 2011-04-28 13:17:30

+0

你的意思是它继续收到消息?然后停止发送这些消息给处理程序! – 2011-04-28 13:19:39

回答

9

考虑:

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; 
      } 
     } 
    }; 
6

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

3

只要Looper实例处于活动状态,这是针对线程的整个生命周期(与活动生命周期无关),您的处理程序(如果以这种方式实现)将处于活动状态。

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

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

4

一个处理程序很简单,就是一个线程的事件循环接口。所以,如果你停止线程,那么你“停止”处理程序。

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

下面是一个例子,其中quit()旨在将一个looper.quit()方法发送到会停止线程和Handler的事件循环。因此,在您的Activity的onPause()或onStop()方法中,只需调用myThread.quit()即可。

+1

优秀的答案。 – aez 2014-12-06 02:46:18

57

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

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); 
} 
+0

它工作...在我的应用程序测试。 – keithics 2013-08-01 16:36:59

+0

myHandler必须onStop – mehmet 2016-12-24 09:26:24