【问题标题】:how to stop Handler in Android?如何在Android中停止处理程序?
【发布时间】:2023-03-10 02:03:01
【问题描述】:

在我的应用程序中,我的处理程序不会停止。如何停止处理程序?
它在关闭活动后继续启动。我能做些什么?

代码是:

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

【问题讨论】:

  • “我的处理程序不会停止”是什么意思?你怎么理解的?
  • 它正在运行,因为我在 DDMS 中显示..by SYStem.out.println..它继续在我的应用程序中运行..
  • 你的意思是它继续接收消息?然后停止将这些消息发送给处理程序!

标签: android


【解决方案1】:

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

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

【讨论】:

  • myHandler 必须是 onStop
【解决方案2】:

【讨论】:

    【解决方案3】:

    考虑:

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

    【讨论】:

      【解决方案4】:

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

      假设您的 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】:

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

        【讨论】:

          【解决方案6】:

          只要 Looper 实例处于活动状态,您的 Handler(如果这样实现)就会处于活动状态,这是针对线程的整个生命周期(与活动生命周期关系不大)。

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

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

          【讨论】:

            猜你喜欢
            • 2013-01-11
            • 2013-04-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-02-11
            • 1970-01-01
            • 1970-01-01
            • 2021-09-07
            相关资源
            最近更新 更多