我有一个工人Service
和一堆活动。每个Activity
都有一个Handler
。 Activites可以通过Intents
方法将Service
发送到startService
来启动作业。这些作业进入队列,并按顺序处理。
要报告已完成作业的结果,我提供了包含在描述作业的Handler
的Messenger对象中的适当活动Intent
。 Service
通过此邮件向调用Activity
发回一些消息。这很好用。
但是提供的Handlers
似乎仍留在内存中,即使在相应的Activites
被破坏之后,仍继续处理完成消息。
Activity
它们所属的一部分销毁吗?答案 0 :(得分:2)
由于服务引用了仍然引用了活动处理程序的Itnents,因此处理程序不会用于垃圾收集。
你见过this video from Google IO吗?它是关于构建使用RESTful Web服务的应用程序,因此不直接相关,但委派响应长时间运行事件的责任的方法将部分映射到您的问题。
如果您不想更改太多东西,那么您需要在您的Activities onClose或onDestroy中使用一种方法来通知服务(并通过它的Intent)它负责的长时间运行的任务不是需要了。它删除了它对Handler的引用,因此GC可以摆脱它。
在运行任务中管理(如在视频中)并集中管理ServiceHelper类中的生命周期。该课程可以在事情发生时发布事件,活动可以监听这些事件。
这样可以将您的代码放在一个位置,这样您就不必在更改处理服务的方式时更改每个活动。