为什么使用Messenger而不是传递引用到Handler?

14

我有一个主活动和绑定服务。 绑定服务从网络接收命令,触发将消息发送到主活动中的处理程序的消息。 我通过将处理程序的引用传递给服务来使一切正常。 然后...我偶然发现了一个名为 Messenger 的东西。

Messenger: 处理程序的引用,其他人可以使用它向其发送消息。 这允许通过创建指向一个进程中的处理程序的 Messenger,并将该 Messenger 移交给另一个进程,实现基于消息的跨进程通信。

这激发了一些问题:

  • “进程”一词是否意味着除非在进程和线程指南下生成单独的进程,否则我不需要使用Messenger?
  • 始终使用Messenger是好习惯吗?
  • 传递处理程序的引用通常是个坏主意吗?

这不是你问题的答案,但我建议你在后台线程中使用AsyncTask。(请参阅http://developer.android.com/reference/android/os/AsyncTask.html) - Nguyen Minh Binh
1
我正在使用一个绑定的IntentService,它应该处理异步请求。我认为AsyncTask不合适,因为文档中指出“AsyncTasks理想情况下应该用于短时间操作(最多几秒钟)”,而我的服务正在监听来自互联网的命令,并且可能在整个活动的生命周期内运行。 - Rich
1
另外一点需要注意的是,AsyncTasks 必须从 UI 线程中调用。 - Selecsosi
2个回答

10

这个术语中的进程是否意味着除非我根据“进程和线程指南”生成独立进程,否则我不需要使用Messenger?

是的。如果要绑定远程服务(例如在另一个进程中运行),则需要使用Messenger。在这种情况下,为了向远程服务提供指向您的处理程序的指针,唯一的选择就是使用Messenger。

总是使用Messenger是好习惯吗?

我不这样认为。只有在真正需要时才使用它-用于远程服务或者启动服务时未进行绑定。您可以将Messenger作为extra打包到Intent中,并使用它启动服务。因此,您可以传递对处理程序的引用而无需绑定服务。这是另一种使用Messenger的情况。

传递处理程序的引用通常是个坏主意吗?

如果在活动开始和停止时正确处理Handler的注册和注销,则应该没有问题。那么就没有必要为本地服务使用Messenger。如果没有正确注销处理程序,则会出现内存泄漏(服务引用处理程序,处理程序引用已停止的活动)。


1
Messenger相比于Handler的主要优点在于,Messenger能够排队处理来自各个客户端发送的所有消息。而Handler需要一个looper才能实现这一点。因此,在远程进程之间进行IPC时,Messenger具有额外的优势。

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