Android AIDL中方法调用和回调线程问题探讨

在Android中咱们暂且把线程分为三种,主线程,子线程,binder线程。
binder线程概念较复杂,我们这里不讨论。

怎样产生binder线程?
通过AIDL调用,在一定场景下代码会运行在binder线程中,如下所示:

先介绍一个概念oneway关键字:
使用oneway时,远程调用不会阻塞;它只是发送事务数据并立即返回。接口的实现最终接收此调用时,是以正常远程调用形式将其作为来自 Binder 线程池的常规调用进行接收。

image.png
  • 1:客户端在主线程/子线程/binder线程调用服务端方法,此时服务的方法运行在什么线程中呢?

客户端调用服务端方法时,客户端发起调用时线程和服务端响应线程对应关系如下:

方法声明oneway 时:

下图中Binder:7649_3,main, Thread-2即客户端调用方法时线程。


方法有oneway.png
客户端调用方法时线程 服务端响应客户端方法时线程
主线程 binder线程
子线程 binder线程
binder线程 binder线程
方法声明没有oneway 时:
方法没有oneway.png
客户端调用方法时线程 服务端响应客户端方法时线程
主线程 binder线程
子线程 binder线程
binder线程 主线程
  • 2:服务端在子线程/主线程中调用客户端回调接口,此时客户端回调接口运行在binder线程中。
    下图中Binder:6527_1,Thread-2, main 是服务端调用回调时,线程名称。
    6509即为客户端进程号。


    回调方法不带oneway.png
服务端回调给客户端时线程 客户端收到回调时线程
主线程 binder线程
子线程 binder线程
binder线程 主线程
回调方法带oneway.png
服务端回调给客户端时线程 客户端收到回调时线程
主线程 binder线程
子线程 binder线程
binder线程 binder线程

你可能感兴趣的:(Android AIDL中方法调用和回调线程问题探讨)