【问题标题】:What is faster communicating using a messenger or an intent?使用信使或意图进行更快的通信是什么?
【发布时间】:2023-03-19 02:13:02
【问题描述】:

如果您有活动与服务通信,或者另一个服务与服务通信,哪种“通信协议”可以更快地将其消息传递给绑定方?

从服务传输到/从服务传输的消息都是字符串或可打包的对象。

如果您想将批量数据发送到其他服务或活动,我很难确定哪种方法更快。我找不到有关 Messenger 发送的意图或消息的处理速度的详细信息。

有人有这方面的经验吗?

【问题讨论】:

  • 两者都计时有问题吗?
  • @cHao:你到底是什么意思?我需要在活动/服务和服务/服务之间以最快的方式进行通信。
  • 我的意思是,尝试两者并观察两者之间的任何性能差异听起来并不难。坦率地说,如果它那么那么重要,那么如果你接受别人的话,那就太傻了:re:哪个更快;任何差异都将在很大程度上取决于您的特定用例。
  • @cHao:关于愚蠢的事情是真实的 :) 但是任何建议(如果它是真实的或根本不是真实的)都是受欢迎的。更多人 = 更多答案 = 更好的判断对错的线索。

标签: android android-intent android-service parcelable messenger


【解决方案1】:

对于 Intent,IntentResolver 需要时间来找到合适的目标,因为它将搜索接收者列表。这种情况的表现将取决于您的系统和接收器的数量,IntentResolver 需要搜索以找到合适的接收器。

另一方面,如果您通过Handler 发送Message,它将使用同一线程的消息队列,这种情况下的性能将取决于该队列上的可用消息。

所以看起来消息会比 Intent 更快,或者至少在理论上,但你总是可以编写一个简短的程序来查看输出。

但是,如果您有大量数据要从服务发送到 Activity,您可以考虑另一种替代解决方案,将数据写入持久性存储,然后通知您的 Activity 数据已准备好。收到通知后,Activity 从数据源中读取数据。这样,如果用户接到电话或在您之间受到干扰,数据是安全的。

【讨论】:

  • 还需要做服务/服务通信,所以这种情况下不需要持久化存储。我的猜测是使用 Messenger 而不是 Intents 来处理流量。同样在线程之间最好使用消息(可以转发到另一个信使队列)。我不知道如何使用 Intents 在线程之间进行通信。这些是我的假设。我希望有人已经弄清楚了……
【解决方案2】:

您可能需要考虑 LocalBroadcastManager.sendBroadcastSync() http://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html#sendBroadcastSync(android.content.Intent)

如果您的活动和服务在同一个进程中,那么最好使用 LBM,因为它更快、更安全。它为您提供了发送广播“同步”的选项,这意味着它会立即处理,因此它可能符合“最快”的条件,即使消息/处理程序比意图/接收器更快。

【讨论】:

  • 不错的提示,谢谢!另一件事是当我从一个服务转到另一个服务时(在同一个进程中),我读到一条消息(Messenger 2 Messenger)是在同一个 UI 线程(主线程)中处理的。如果我需要将消息转发到服务中的另一个线程,我需要在主线程处理程序中处理来自“其他”服务的消息,该处理程序接下来在线程处理程序中处理它。反之亦然。我认为这比使用 Intent 更快(如何将服务中收到的 Intent 转发到该服务中的另一个线程??)。除此之外,消息被 .obtain() 重用:)
  • ... 我不记得 Intent 对象是可重用的(假设!),因此增加了创建时间(通信速度)。当我想告诉多个客户某些事情发生了变化时,您的 LBM 提示非常有用,但我不确定它是否会更快,我认为它更方便(假设!)。您将如何测试哪个更快以进行平等和公平的比较?有什么想法吗?
  • 请详细说明您的答案中“更安全”的部分。您是指与普通 Intent 消息相比更安全还是与 Messenger 消息相比更安全?
  • 本地意图比常规意图更安全,因为它们保留在进程中。关于速度,我不确定您是在测量调用和接收的 CPU 时间,还是调用和接收之间的时间(例如延迟)。如果您担心延迟,我认为 LBM sendBroadcastSync 是最好的;使用其他选项时,延迟的变化很大。
  • 在上面的示例中,将消息从一个服务发送到另一个服务,然后在辅助线程中处理它,我认为您可能会考虑使用 IntentService - 系统会将意图传递给辅助线程你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 1970-01-01
  • 2021-09-22
  • 2019-01-14
  • 2021-11-26
  • 2011-12-13
相关资源
最近更新 更多