在Android中咱們暫且把線程分為三種,主線程安吁,子線程醉蚁,binder線程。
binder線程概念較復(fù)雜鬼店,我們這里不討論馍管。
怎樣產(chǎn)生binder線程?
通過AIDL調(diào)用薪韩,在一定場景下代碼會運(yùn)行在binder線程中确沸,如下所示:
先介紹一個(gè)概念oneway關(guān)鍵字:
使用oneway時(shí),遠(yuǎn)程調(diào)用不會阻塞俘陷;它只是發(fā)送事務(wù)數(shù)據(jù)并立即返回罗捎。接口的實(shí)現(xiàn)最終接收此調(diào)用時(shí),是以正常遠(yuǎn)程調(diào)用形式將其作為來自 Binder 線程池的常規(guī)調(diào)用進(jìn)行接收拉盾。
image.png
- 1:客戶端在主線程/子線程/binder線程調(diào)用服務(wù)端方法桨菜,此時(shí)服務(wù)的方法運(yùn)行在什么線程中呢?
客戶端調(diào)用服務(wù)端方法時(shí)捉偏,客戶端發(fā)起調(diào)用時(shí)線程和服務(wù)端響應(yīng)線程對應(yīng)關(guān)系如下:
方法聲明oneway 時(shí):
下圖中Binder:7649_3倒得,main, Thread-2即客戶端調(diào)用方法時(shí)線程夭禽。
方法有oneway.png
客戶端調(diào)用方法時(shí)線程 | 服務(wù)端響應(yīng)客戶端方法時(shí)線程 |
---|---|
主線程 | binder線程 |
子線程 | binder線程 |
binder線程 | binder線程 |
方法聲明沒有oneway 時(shí):
方法沒有oneway.png
客戶端調(diào)用方法時(shí)線程 | 服務(wù)端響應(yīng)客戶端方法時(shí)線程 |
---|---|
主線程 | binder線程 |
子線程 | binder線程 |
binder線程 | 主線程 |
-
2:服務(wù)端在子線程/主線程中調(diào)用客戶端回調(diào)接口霞掺,此時(shí)客戶端回調(diào)接口運(yùn)行在binder線程中。
下圖中Binder:6527_1,Thread-2, main 是服務(wù)端調(diào)用回調(diào)時(shí)讹躯,線程名稱菩彬。
6509即為客戶端進(jìn)程號。
回調(diào)方法不帶oneway.png
服務(wù)端回調(diào)給客戶端時(shí)線程 | 客戶端收到回調(diào)時(shí)線程 |
---|---|
主線程 | binder線程 |
子線程 | binder線程 |
binder線程 | 主線程 |
回調(diào)方法帶oneway.png
服務(wù)端回調(diào)給客戶端時(shí)線程 | 客戶端收到回調(diào)時(shí)線程 |
---|---|
主線程 | binder線程 |
子線程 | binder線程 |
binder線程 | binder線程 |