如何停止处理程序?

19

我有一个疑问... 在我的应用程序中,我有一个活动处理程序。尽管我的活动已经被销毁了,但处理程序仍然在运行。它是否在不同于应用程序进程的其他进程上运行?能否请有人解释一下为什么会这样运行?

在活动的onDestroy方法中是否有可能停止该处理程序?

提前感谢。


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

26

根据文档描述

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

执行该任务。


1
如果在Activity的onCreate方法中进行内联调用,你该如何做呢?例如:handler = new Handler() { public void handleMessage(Message msg) { ... } }; - JPM
发送消息时,您必须定义“what”值。然后,您可以稍后引用它并请求handler.removeMessages(what)。 - Zelimir

1

你的意思是你在你的活动中有一个线程吗?停止线程非常容易,你需要有该线程的引用。例如:

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

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

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

希望能有所帮助


0

我喜欢Zelimir的回答,以下是更多相关信息 - Android没有为应用程序生命周期定义限制,应用程序在第一次启动时创建,并可能在多个Activities的onCreate/onDestroy周期之间保持活动状态。Handlers与Application单个主事件线程/队列相关联,因此活动无法“停止”它(尽管您可能可以通过Handler.getLooper().quit()来做到这一点,但我不确定它是否会导致问题。此外,您可以像here所述那样杀死整个应用程序)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接