工作隊(duì)列的管理
抽象
對(duì)藍(lán)牙的相關(guān)操作赢织,作者將其抽象為一個(gè)個(gè)操作流程擎鸠。
runnable.png
為了形象直觀一些,我稱(chēng)這個(gè)流程為熊孩子:
你有一堆熊孩子炕贵,這些熊孩子都有自己的想法诗良,愛(ài)調(diào)皮搗蛋。那么這一堆熊孩子該怎么管理呢鲁驶?
如何管理這一堆流程呢鉴裹?
用隊(duì)列管理著一群熊孩子
Paste_Image.png
RxAndroidBLE 中使用的是 PriorityBlockingQueue。他包裝了一下:
PriorityBlockingQueue:這個(gè)隊(duì)列中的每個(gè)對(duì)象可具有優(yōu)先級(jí)的
按什么優(yōu)先級(jí)钥弯?你的對(duì)象實(shí)現(xiàn) Comparable即可径荔。如作者實(shí)現(xiàn)的:
- 根據(jù) RxBleRadioOperation 的優(yōu)先級(jí)比較結(jié)果
- 再根據(jù) 每個(gè)操作的入隊(duì)的自然順序。
入隊(duì)
- 訂閱時(shí)入隊(duì)脆霎。
- 取消訂閱時(shí)出隊(duì)总处。
- 操作的執(zhí)行,會(huì)生產(chǎn)一堆東西睛蛛。asObservable:得到被觀察者鹦马。
隊(duì)列的執(zhí)行控制?
當(dāng)一個(gè)任務(wù)出隊(duì)忆肾,被執(zhí)行完畢后荸频,再?gòu)年?duì)列中取出下個(gè)任務(wù)來(lái)執(zhí)行。
看一下RxAndroidBLE 中隊(duì)列的管理:
Paste_Image.png
- 開(kāi)啟單獨(dú)的一個(gè)線(xiàn)程客冈,這個(gè)線(xiàn)程來(lái)維護(hù)這個(gè)優(yōu)先級(jí)隊(duì)列旭从。
- 線(xiàn)程如何來(lái)控制任務(wù)的執(zhí)行?通過(guò)信號(hào)
信號(hào)量:線(xiàn)程的執(zhí)行需要在信號(hào)量提供許可證的前提下才能繼續(xù)執(zhí)行场仲。而這個(gè)許可證由具體的熊孩子來(lái)釋放許可和悦。
細(xì)看操作流程:RxBleRadioOperation
1. 他是一個(gè)執(zhí)行流程:
runnable
run
- 生產(chǎn)出錯(cuò):就發(fā)射錯(cuò)誤異常給消費(fèi)者。
- 生產(chǎn)實(shí)現(xiàn):
protected abstract void protectedRun()
2. 它管理者事件的生產(chǎn)與訂閱渠缕。
它持有 replaySubject鸽素,通過(guò)replaySubject 你想發(fā)布東西,訂閱?wèn)|西就很簡(jiǎn)單啦亦鳞!
ReplaySubject
看一個(gè)具體的實(shí)現(xiàn)來(lái)熱熱身:
RxBleRadioOperationScan 中的生產(chǎn)實(shí)現(xiàn):
生產(chǎn)的 藍(lán)牙設(shè)備信息:
Paste_Image.png