【Rxandroid】Rxandroid源码解读

作者: itbird01 | 来源:发表于2017-03-09 18:16 被阅读354次

    将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的执行线程,这里采取一切方式保证其在主线程中执行。

    总结

    主要类图

    LooperScheduler类图 MainThreadSubscription类图 HandlerWorker类图

    相关文章

      网友评论

        本文标题:【Rxandroid】Rxandroid源码解读

        本文链接:https://www.haomeiwen.com/subject/odkwgttx.html