【发布时间】:2011-02-18 05:42:39
【问题描述】:
我有一个疑问.. 我的应用程序中的活动中有一个处理程序。尽管我的活动破坏了处理程序仍在运行。它是否在应用程序进程以外的不同进程上运行?任何人都可以解释为什么它会这样工作吗? 是否可以在活动 onDestroy 时停止处理程序?
提前致谢。
【问题讨论】:
-
如果您提供处理程序的详细信息会很有帮助,如果您发布代码会更好。另外,您是否在不同的线程上实例化处理程序?
标签: android
我有一个疑问.. 我的应用程序中的活动中有一个处理程序。尽管我的活动破坏了处理程序仍在运行。它是否在应用程序进程以外的不同进程上运行?任何人都可以解释为什么它会这样工作吗? 是否可以在活动 onDestroy 时停止处理程序?
提前致谢。
【问题讨论】:
标签: android
如文档中所述
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);
执行该任务。
【讨论】:
你的意思是你的活动中有一个线程吗?停止一个线程很容易,您需要对该线程有一个参考。喜欢:
private Thread mMyThread;
mMyThread = new Thread .......
当你想停止它时,只需检查引用是否为空并调用中断方法:
if (mMyThread != null) {
mMyThread.interrupt();
}
希望对你有帮助
【讨论】:
我喜欢 Zelimir 的回答,只是关于此事的更多信息 - Android 没有定义应用程序生命的限制,应用程序是在第一次启动时创建的,并且可能在几个活动 onCreate/onDestroy 周期之间保持活动状态。处理程序与应用程序单个主事件线程/队列相关联,因此活动不能“停止”它(尽管您可能可以通过 Handler.getLooper().quit() 来做到这一点,但我不确定它是否会不会引起问题。您也可以按照此处here 的描述杀死整个应用程序。
可能 Android 的概念是尽可能地重用应用程序实例,因此您在开发 Activity 时主要关心的是在 onDestroy 调用时正确清除 Activity 的资源。处理程序中的静态变量、线程、AsyncTasks 和消息/回调是需要担心的项目。
【讨论】: