我有一个疑问... 在我的应用程序中,我有一个活动处理程序。尽管我的活动已经被销毁了,但处理程序仍然在运行。它是否在不同于应用程序进程的其他进程上运行?能否请有人解释一下为什么会这样运行?
在活动的onDestroy方法中是否有可能停止该处理程序?
提前感谢。
我有一个疑问... 在我的应用程序中,我有一个活动处理程序。尽管我的活动已经被销毁了,但处理程序仍然在运行。它是否在不同于应用程序进程的其他进程上运行?能否请有人解释一下为什么会这样运行?
在活动的onDestroy方法中是否有可能停止该处理程序?
提前感谢。
根据文档描述
http://developer.android.com/reference/android/os/Handler.html
"每个 Handler 实例都与单个线程及其消息队列相关联。"
当您即将完成活动,例如在 onDestroy()
中,您还需要取消用于启动它的可运行项的回调函数:
mHandler.removeCallbacks(previouslyStartedRunnable);
即使在你的活动处于活动状态时,你也可以做到这一点,而无需检查runnable是否已经被触发。
更新:
还有两种情况需要考虑:
1.) 你已经以创建Runnable的新类的方式实现了你的Handler,例如
private class HandleUpdateInd implements Runnable...
如果您需要使用当前设置的参数(这些参数可能会在运行时更改)启动延迟的可运行任务,则通常需要执行此操作。要取消它,您需要使用
mHandler.removeCallbacksAndMessages(HandleUpdateInd.class);
2.) 如果您正在使用内联调用(感谢JPM的评论)
handler = new Handler() { public void handleMessage(Message msg) { ... } };
那么您需要为该消息定义“what”值。稍后,如果您需要取消它,可以使用
handler.removeMessages(what);
执行该任务。
你的意思是你在你的活动中有一个线程吗?停止线程非常容易,你需要有该线程的引用。例如:
private Thread mMyThread;
mMyThread = new Thread .......
当你想要停止它时,只需检查引用是否不为空并调用中断方法:
if (mMyThread != null) {
mMyThread.interrupt();
}
希望能有所帮助
我喜欢Zelimir的回答,以下是更多相关信息 - Android没有为应用程序生命周期定义限制,应用程序在第一次启动时创建,并可能在多个Activities的onCreate/onDestroy周期之间保持活动状态。Handlers与Application单个主事件线程/队列相关联,因此活动无法“停止”它(尽管您可能可以通过Handler.getLooper().quit()来做到这一点,但我不确定它是否会导致问题。此外,您可以像here所述那样杀死整个应用程序)。
Android的概念可能是尽可能多地重复使用应用程序实例,因此在开发Activity时,您的首要关注点是在onDestroy调用时正确清除Activity资源。静态变量、线程、AsyncTasks和处理程序中的消息/回调是需要担心的项目。