4

我有一个 WorkerService和一堆活动。每个Activity人都有一个Handler。Activites 可以通过发送IntentsServicewithstartService方法来启动作业。这些作业进入队列,并按顺序处理。

为了报告已完成作业的结果,我提供了Handler包含在 Messenger 对象中的正确 Activity,并带有Intent描述作业的 。通过这个Service发回一些用于调用的消息Activity。这工作得很好。

但是提供的Handlers似乎保留在内存中,即使在相应的Activites被销毁之后,继续处理完成消息。

  • 怎么会这样?处理程序不应该与Activity它们所属的部分一起被销毁吗?
  • 这会导致内存泄漏吗?
4

1 回答 1

2

由于服务引用了仍然引用活动处理程序的 Itnents,因此处理程序不会可用于垃圾收集。

你看过Google IO 的这个视频吗?它是关于构建使用 RESTful Web 服务的应用程序,因此不直接相关,但委派响应长期运行事件的责任的方法将部分映射到您的问题。

如果你不想改变太多,那么你需要在你的活动 onClose 或 onDestroy 中通知服务(并通过它的意图)它负责的长期运行的任务不再需要。它删除了对 Handler 的引用,因此 GC 可以摆脱它。

或者在 ServiceHelper 类中集中管理运行任务和响应其生命周期(如视频中所示)。该类可以在事情发生时发布事件,并且活动可以侦听这些事件。

这样做的好处是您的代码位于一个位置,因此当您想要更改处理服务的方式时,您不必更改每个活动。

于 2012-10-02T12:38:45.247 回答