【问题标题】:How to stop the handler?如何停止处理程序?
【发布时间】:2011-02-18 05:42:39
【问题描述】:

我有一个疑问.. 我的应用程序中的活动中有一个处理程序。尽管我的活动破坏了处理程序仍在运行。它是否在应用程序进程以外的不同进程上运行?任何人都可以解释为什么它会这样工作吗? 是否可以在活动 onDestroy 时停止处理程序?

提前致谢。

【问题讨论】:

  • 如果您提供处理程序的详细信息会很有帮助,如果您发布代码会更好。另外,您是否在不同的线程上实例化处理程序?

标签: android


【解决方案1】:

如文档中所述

http://developer.android.com/reference/android/os/Handler.html

“每个 Handler 实例都与单个线程和该线程的消息队列相关联。”

当您即将完成活动时,例如在onDestroy() 中,您还需要取消为其启动的可运行对象的回调:

mHandler.removeCallbacks(previouslyStartedRunnable);

即使在您的活动处于活动状态时,您也可以不检查是否已触发 runnable。

更新:

还有两种情况需要考虑:

1.) 您已经以一种为 Runnable 创建新类的方式实现了您的 Handler,例如

private class HandleUpdateInd implements Runnable...

通常,如果您必须使用当前的一组参数(在 runnable 触发之前可能会更改)开始延迟可运行,则您需要这样做。要取消它,您需要使用

mHandler.removeCallbacksAndMessages(HandleUpdateInd.class);

2.) 如果您使用的是内联调用(JPM 感谢您的评论)

handler = new Handler() { public void handleMessage(Message msg) { ... } };

然后您需要为该消息定义“什么”值。稍后,如果您需要取消它,您可以使用

handler.removeMessages(what); 

执行该任务。

【讨论】:

  • 如果它在您的活动的 onCreate 中是内联调用,您将如何执行此操作?即 handler = new Handler() { public void handleMessage(Message msg) { ... } };
  • 发送消息时,您必须定义“what”值。然后你可以稍后参考它并请求 handler.removeMessages(what);
【解决方案2】:

你的意思是你的活动中有一个线程吗?停止一个线程很容易,您需要对该线程有一个参考。喜欢:

private Thread mMyThread;
mMyThread = new Thread .......

当你想停止它时,只需检查引用是否为空并调用中断方法:

if (mMyThread != null) {
    mMyThread.interrupt();
}

希望对你有帮助

【讨论】:

    【解决方案3】:

    我喜欢 Zelimir 的回答,只是关于此事的更多信息 - Android 没有定义应用程序生命的限制,应用程序是在第一次启动时创建的,并且可能在几个活动 onCreate/onDestroy 周期之间保持活动状态。处理程序与应用程序单个主事件线程/队列相关联,因此活动不能“停止”它(尽管您可能可以通过 Handler.getLooper().quit() 来做到这一点,但我不确定它是否会不会引起问题。您也可以按照此处here 的描述杀死整个应用程序。

    可能 Android 的概念是尽可能地重用应用程序实例,因此您在开发 Activity 时主要关心的是在 onDestroy 调用时正确清除 Activity 的资源。处理程序中的静态变量、线程、AsyncTasks 和消息/回调是需要担心的项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 2013-04-03
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      相关资源
      最近更新 更多