【Rxandroid】Rxandroid源码解读

将Rxandroid(1.2.1)引入我们的项目工程之后,可以看到Rxandroid的包结构

【Rxandroid】Rxandroid源码解读_第1张图片
Rxandroid的包结构

从包结构中,我们了解到相比于Rxjava多了如下几个类:

AndroidSchedulers

BuildConfig    

HandlerScheduler    

LooperScheduler

MainThreadSubscription    

RxAndroidPlugins    

RxAndroidSchedulersHook

1.AndroidSchedulers类的源码

【Rxandroid】Rxandroid源码解读_第2张图片
AndroidSchedulers类的源码

从源码中我们知道,这个类主要提供了主线程的调度,在Rxjava项目中需要再主线程中处理的操作都会用到这个类中的mainThreadScheduler。源码中采用单例, 并且这个单例是使用AtomicReference的原子操作,用于保证在多线程情况下,线程获取的值都是最新的,正确的。实例化时到了RxAndroidPlugins,通过RxAndroidPlugins获取mainThreadScheduler,如果为null则LooperScheduler(Looper.getMainLooper()),不为null则返回

2.RxAndroidPlugins类的源码

【Rxandroid】Rxandroid源码解读_第3张图片
RxAndroidPlugins类的源码

解读源码可知,RxAndroidPlugins同样也采用了单例and AtomicReference,实例化时调用了RxAndroidSechedulersHook的getDefaultInstance方法

3.RxAndroidSechedulersHook类的源码

【Rxandroid】Rxandroid源码解读_第4张图片
RxAndroidSechedulersHook类的源码

通过源码我们知道getMainThreadScheduler返回为null,结合前面解析所知AndroidSchedulers在得到mainThreadScheduler时,判断hook得到的是否为null,如果为null,则去通过LooperScheduler创建,那么问题来了。。。绕了这么大圈,既然hook的getMainThreadScheduler为null,还要去调用hook干嘛???

别着急,这时去看RxAndroidSechedulersHook的onSchedule方法的注释,关键在于这个方法,该方法在把action 交给Scheduler处理之前被执行, 可以用于包装/装饰/日志记录, 默认值只是传递作用,直接返回。

4.LooperScheduler类的源码

【Rxandroid】Rxandroid源码解读_第5张图片
LooperScheduler部分源码

解析源码可知,LooperScheduler继承与Scheduler,内部用handler进行协作处理,LooperScheduler中覆盖重写了createWorker方法,内部实际调用了内部类HandlerWorker,HandlerWorker继承与Worker,那么worder是个什么东西呢?

【Rxandroid】Rxandroid源码解读_第6张图片
Worker类源码

这时我们清楚了,Worker实际上是Scheduler里 的一个静态抽象类,实现了Subscription接口,因此也就有unSubscriber方法。可以取消订阅,但是Worker并没有实现取消订阅方法,而是交给子类去实现,比如这里的HandlerWorker就实现了Worker抽象类

【Rxandroid】Rxandroid源码解读_第7张图片
HandlerWorker关键源码

HandlerWorker实现了schedule方法,一个是有延时的,一个是无延时的。 从代码看首先判断了是否被取消订阅了, 取消了则直接返回,不做任何处理,否者接着走。

接着往下看,高能预警.....


action =hook.onSchedule(action);

这不是RxAndroidSchedulersHook 里的那个我们之前放着的方法吗?居然在这里被调用了。

接着走这里又跳出来个ScheduledAction

【Rxandroid】Rxandroid源码解读_第8张图片
ScheduledAction源码

从源码中不难看出, 在LooperScheduler 中创建的handler, 交给HandlerWorker后又交给了ScheduledAction。 该类实现了Runnable 接口,run方法里面调用了action.call() ;看来这里才是真正调用的地方。对于handler如何处理runnable,这就是handler源码中dispatchMessage消息分发机制了。

5.HandlerScheduler类的源码

【Rxandroid】Rxandroid源码解读_第9张图片
HandlerScheduler类的源码

有源码可知,HandlerScheduler实际上是继承与LooperScheduler的。

6.BuildConfig类的源码

【Rxandroid】Rxandroid源码解读_第10张图片
BuildConfig类的源码

主要是一些常量配置

7.MainThreadSubscription类的源码

【Rxandroid】Rxandroid源码解读_第11张图片
MainThreadSubscription类的源码

解析源码可知,MainThreadSubscription其实主要保证的是unsubscribe的执行线程,这里采取一切方式保证其在主线程中执行。

总结

主要类图

【Rxandroid】Rxandroid源码解读_第12张图片
LooperScheduler类图
【Rxandroid】Rxandroid源码解读_第13张图片
MainThreadSubscription类图
【Rxandroid】Rxandroid源码解读_第14张图片
HandlerWorker类图

你可能感兴趣的:(【Rxandroid】Rxandroid源码解读)