【问题标题】:Why is AIDL necessary to support multithreading?为什么需要 AIDL 来支持多线程?
【发布时间】:2014-02-05 17:45:53
【问题描述】:

根据来自AIDL 文档的这条消息,AIDL 只有一个有效用例。

仅当您允许来自不同应用程序的客户端访问您的 IPC 服务并希望在您的服务中处理多线程时,才需要使用 AIDL。

在这种情况下,“处理多线程”究竟是什么意思?这不仅仅是拥有一个具有多个运行线程的服务吗?

文档进一步说明:

如果您想执行 IPC,但不需要处理多线程,请使用 Messenger 实现您的接口。

为什么支持多线程的服务无法接受 Messenger?无法在 messenger 内部处理线程之间的通信(不使用共享内存)?

这里的问题是这段代码会比使用处理程序复杂得多吗?

【问题讨论】:

    标签: android multithreading aidl


    【解决方案1】:

    这只是意味着 AIDL 调用可以是并发的(例如,多个应用程序在同一服务上调用相同的 AIDL 接口),因为 Android 会为您处理这个,但 Messenger 不是(但您可以手动进行)。

    【讨论】:

    • 那么让服务的多个客户端实例化messenger并向服务发送消息是可以的,但是这些消息不会被同时处理?
    • 不,这不好,因为它可能不是线程安全的,具体取决于您实现它的方式。我的意思是如果你使用Messenger,你必须注意潜在的线程安全。
    • 嗯,虽然线程安全会在消息处理完毕后发生。从docs 看来,让许多线程通过信使发送消息很好。 (见左边的注释)。最大的不同似乎是 AIDL 会自动为你创建一个线程池。并发管理水平几乎相同。
    • 是的,正确,您需要自己创建线程。实际上,我已经使用 Messenger 而不是 AIDL 实现了支持多线程的服务。
    【解决方案2】:

    根据http://developer.android.com/guide/components/bound-services.html。信使使用单线程对消息进行排队。因此无需处理任何同步问题。如果是 AIDL,则由开发人员负责。

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      • 2018-08-03
      相关资源
      最近更新 更多