工作队列的管理
抽象
对蓝牙的相关操作,作者将其抽象为一个个操作流程。
runnable.png
为了形象直观一些,我称这个流程为熊孩子:
你有一堆熊孩子,这些熊孩子都有自己的想法,爱调皮捣蛋。那么这一堆熊孩子该怎么管理呢?
如何管理这一堆流程呢?
用队列管理着一群熊孩子
Paste_Image.png
RxAndroidBLE 中使用的是 PriorityBlockingQueue。他包装了一下:
PriorityBlockingQueue:这个队列中的每个对象可具有优先级的
按什么优先级?你的对象实现 Comparable即可。如作者实现的:
- 根据 RxBleRadioOperation 的优先级比较结果
- 再根据 每个操作的入队的自然顺序。
入队
- 订阅时入队。
- 取消订阅时出队。
- 操作的执行,会生产一堆东西。asObservable:得到被观察者。
队列的执行控制?
当一个任务出队,被执行完毕后,再从队列中取出下个任务来执行。
看一下RxAndroidBLE 中队列的管理:
Paste_Image.png
- 开启单独的一个线程,这个线程来维护这个优先级队列。
- 线程如何来控制任务的执行?通过信号
信号量:线程的执行需要在信号量提供许可证的前提下才能继续执行。而这个许可证由具体的熊孩子来释放许可。
细看操作流程:RxBleRadioOperation
1. 他是一个执行流程:
runnable
run
- 生产出错:就发射错误异常给消费者。
- 生产实现:
protected abstract void protectedRun()
2. 它管理者事件的生产与订阅。
它持有 replaySubject,通过replaySubject 你想发布东西,订阅东西就很简单啦!
ReplaySubject
看一个具体的实现来热热身:
RxBleRadioOperationScan 中的生产实现:
生产的 蓝牙设备信息:
Paste_Image.png