RxAndroidBLE 源码分析:队列管理

工作队列的管理

抽象

对蓝牙的相关操作,作者将其抽象为一个个操作流程。

runnable.png

为了形象直观一些,我称这个流程为熊孩子:
你有一堆熊孩子,这些熊孩子都有自己的想法,爱调皮捣蛋。那么这一堆熊孩子该怎么管理呢?

如何管理这一堆流程呢?

用队列管理着一群熊孩子

阻塞队列

RxAndroidBLE 源码分析:队列管理_第1张图片
Paste_Image.png

RxAndroidBLE 中使用的是 PriorityBlockingQueue。他包装了一下:

RxAndroidBLE 源码分析:队列管理_第2张图片

PriorityBlockingQueue:这个队列中的每个对象可具有优先级的
按什么优先级?你的对象实现 Comparable即可。如作者实现的:

RxAndroidBLE 源码分析:队列管理_第3张图片
  1. 根据 RxBleRadioOperation 的优先级比较结果
  2. 再根据 每个操作的入队的自然顺序。

入队

RxAndroidBLE 源码分析:队列管理_第4张图片
  1. 订阅时入队。
  2. 取消订阅时出队。
  3. 操作的执行,会生产一堆东西。asObservable:得到被观察者。

队列的执行控制?

当一个任务出队,被执行完毕后,再从队列中取出下个任务来执行。

看一下RxAndroidBLE 中队列的管理:

RxAndroidBLE 源码分析:队列管理_第5张图片
Paste_Image.png
  1. 开启单独的一个线程,这个线程来维护这个优先级队列。
  2. 线程如何来控制任务的执行?通过信号
    信号量:线程的执行需要在信号量提供许可证的前提下才能继续执行。而这个许可证由具体的熊孩子来释放许可。

细看操作流程:RxBleRadioOperation

1. 他是一个执行流程:
runnable
RxAndroidBLE 源码分析:队列管理_第6张图片
run
  1. 生产出错:就发射错误异常给消费者。
  2. 生产实现:
protected abstract void protectedRun() 
2. 它管理者事件的生产与订阅。

它持有 replaySubject,通过replaySubject 你想发布东西,订阅东西就很简单啦!

RxAndroidBLE 源码分析:队列管理_第7张图片
ReplaySubject

看一个具体的实现来热热身:
RxBleRadioOperationScan 中的生产实现:

RxAndroidBLE 源码分析:队列管理_第8张图片

生产的 蓝牙设备信息:

RxAndroidBLE 源码分析:队列管理_第9张图片
Paste_Image.png

你可能感兴趣的:(RxAndroidBLE 源码分析:队列管理)