在Android中咱们暂且把线程分为三种,主线程,子线程,binder线程。
binder线程概念较复杂,我们这里不讨论。
怎样产生binder线程?
通过AIDL调用,在一定场景下代码会运行在binder线程中,如下所示:
先介绍一个概念oneway关键字:
使用oneway时,远程调用不会阻塞;它只是发送事务数据并立即返回。接口的实现最终接收此调用时,是以正常远程调用形式将其作为来自 Binder 线程池的常规调用进行接收。
- 1:客户端在主线程/子线程/binder线程调用服务端方法,此时服务的方法运行在什么线程中呢?
客户端调用服务端方法时,客户端发起调用时线程和服务端响应线程对应关系如下:
方法声明oneway 时:
下图中Binder:7649_3,main, Thread-2即客户端调用方法时线程。
客户端调用方法时线程 | 服务端响应客户端方法时线程 |
---|---|
主线程 | binder线程 |
子线程 | binder线程 |
binder线程 | binder线程 |
方法声明没有oneway 时:
客户端调用方法时线程 | 服务端响应客户端方法时线程 |
---|---|
主线程 | binder线程 |
子线程 | binder线程 |
binder线程 | 主线程 |
-
2:服务端在子线程/主线程中调用客户端回调接口,此时客户端回调接口运行在binder线程中。
下图中Binder:6527_1,Thread-2, main 是服务端调用回调时,线程名称。
6509即为客户端进程号。
服务端回调给客户端时线程 | 客户端收到回调时线程 |
---|---|
主线程 | binder线程 |
子线程 | binder线程 |
binder线程 | 主线程 |
服务端回调给客户端时线程 | 客户端收到回调时线程 |
---|---|
主线程 | binder线程 |
子线程 | binder线程 |
binder线程 | binder线程 |