将Rxandroid(1.2.1)引入我们的项目工程之后,可以看到Rxandroid的包结构
Rxandroid的包结构从包结构中,我们了解到相比于Rxjava多了如下几个类:
AndroidSchedulers
BuildConfig
HandlerScheduler
LooperScheduler
MainThreadSubscription
RxAndroidPlugins
RxAndroidSchedulersHook
1.AndroidSchedulers类的源码
AndroidSchedulers类的源码从源码中我们知道,这个类主要提供了主线程的调度,在Rxjava项目中需要再主线程中处理的操作都会用到这个类中的mainThreadScheduler。源码中采用单例, 并且这个单例是使用AtomicReference的原子操作,用于保证在多线程情况下,线程获取的值都是最新的,正确的。实例化时到了RxAndroidPlugins,通过RxAndroidPlugins获取mainThreadScheduler,如果为null则LooperScheduler(Looper.getMainLooper()),不为null则返回
2.RxAndroidPlugins类的源码
RxAndroidPlugins类的源码解读源码可知,RxAndroidPlugins同样也采用了单例and AtomicReference,实例化时调用了RxAndroidSechedulersHook的getDefaultInstance方法
3.RxAndroidSechedulersHook类的源码
RxAndroidSechedulersHook类的源码通过源码我们知道getMainThreadScheduler返回为null,结合前面解析所知AndroidSchedulers在得到mainThreadScheduler时,判断hook得到的是否为null,如果为null,则去通过LooperScheduler创建,那么问题来了。。。绕了这么大圈,既然hook的getMainThreadScheduler为null,还要去调用hook干嘛???
别着急,这时去看RxAndroidSechedulersHook的onSchedule方法的注释,关键在于这个方法,该方法在把action 交给Scheduler处理之前被执行, 可以用于包装/装饰/日志记录, 默认值只是传递作用,直接返回。
4.LooperScheduler类的源码
LooperScheduler部分源码解析源码可知,LooperScheduler继承与Scheduler,内部用handler进行协作处理,LooperScheduler中覆盖重写了createWorker方法,内部实际调用了内部类HandlerWorker,HandlerWorker继承与Worker,那么worder是个什么东西呢?
Worker类源码这时我们清楚了,Worker实际上是Scheduler里 的一个静态抽象类,实现了Subscription接口,因此也就有unSubscriber方法。可以取消订阅,但是Worker并没有实现取消订阅方法,而是交给子类去实现,比如这里的HandlerWorker就实现了Worker抽象类
HandlerWorker关键源码HandlerWorker实现了schedule方法,一个是有延时的,一个是无延时的。 从代码看首先判断了是否被取消订阅了, 取消了则直接返回,不做任何处理,否者接着走。
接着往下看,高能预警.....
action =hook.onSchedule(action);
这不是RxAndroidSchedulersHook 里的那个我们之前放着的方法吗?居然在这里被调用了。
接着走这里又跳出来个ScheduledAction
ScheduledAction源码从源码中不难看出, 在LooperScheduler 中创建的handler, 交给HandlerWorker后又交给了ScheduledAction。 该类实现了Runnable 接口,run方法里面调用了action.call() ;看来这里才是真正调用的地方。对于handler如何处理runnable,这就是handler源码中dispatchMessage消息分发机制了。
5.HandlerScheduler类的源码
HandlerScheduler类的源码有源码可知,HandlerScheduler实际上是继承与LooperScheduler的。
6.BuildConfig类的源码
BuildConfig类的源码主要是一些常量配置
7.MainThreadSubscription类的源码
MainThreadSubscription类的源码解析源码可知,MainThreadSubscription其实主要保证的是unsubscribe的执行线程,这里采取一切方式保证其在主线程中执行。
网友评论