此活动 - 服务消息传递模式是否会导致内存泄漏?

时间:2011-04-18 20:55:34

标签: android memory-leaks android-service android-lifecycle

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

要报告已完成作业的结果,我提供了包含在描述作业的Handler的Messenger对象中的适当活动IntentService通过此邮件向调用Activity发回一些消息。这很好用。

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

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

1 个答案:

答案 0 :(得分:2)

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

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

如果您不想更改太多东西,那么您需要在您的Activities onClose或onDestroy中使用一种方法来通知服务(并通过它的Intent)它负责的长时间运行的任务不是需要了。它删除了它对Handler的引用,因此GC可以摆脱它。

在运行任务中管理(如在视频中)并集中管理ServiceHelper类中的生命周期。该课程可以在事情发生时发布事件,活动可以监听这些事件。

这样可以将您的代码放在一个位置,这样您就不必在更改处理服务的方式时更改每个活动。