RxJava 线程切换流程

RxJava 线程切换流程

在客户端开发中有些时候需要多线程切换
作为Android开发者中最经典的模型是Handler+Looper+Message,这种写法稍有不慎会有内存泄漏的风险,后出了RxJava+RxAndroid 因为使用Rxjava切换线程比较简单,而且不容易出现令人讨厌的Casher。所以本人看了一下RxJava切换线程源码过程。本文章适合有一定基础的读者,只做关键代码解读。
先上一段简单的Demo
RxJava 线程切换流程_第1张图片

直接戳进create
在这里插入图片描述
RxJavaPlugins 里的大部分方法都是工具类,可以不需要仔细阅读
主要看创建了一个ObservableCreate 戳进 ObservableCreate

RxJava 线程切换流程_第2张图片
ObservableCreate 继承 Observable 构造方法只传入了 ObservableOnSubscribe 并且把source 设为了全局对象,这段代码只能看出来这些。继续看demo,后面调用了subscribeOn 这次做了一次线程的切换,先选择切换线程的类型,我这里选择了io,戳进subscribeOn 进行查看

RxJava 线程切换流程_第3张图片
忽略掉没用的,此处的this,应该是当前创建的Observable,subscribe看ObservableSubscribeOn戳进去
RxJava 线程切换流程_第4张图片
只传入了source 和线程类型scheduler,并super了source 和把线程类型同步成了全局变量 看一下super戳进

在这里插入图片描述
此处可以看出 此类最后还是继承了Observable ,并且把 source 同步成了全局对象,此时切换线程的准备动作已经准备完毕,可以忽略Demo 中间部分的代码,直接戳到subscribe,subscribe是开始执行的过程,看一下入参为Observer的subscribe 方法
RxJava 线程切换流程_第5张图片
忽略掉没用的看一下 subscribeActual 这是个抽象方法
在这里插入图片描述
又因为我们之前做了一次subscribeOn->所以看一下ObservableSubscribeOn里面的实现

RxJava 线程切换流程_第6张图片
可以看到调用 s.onSubscribe(parent); 由此可见 RxJava的调用方式是由下而上形成一个环形调用
所以Demo中的onSubscribe的线程类型肯定是当前线程
先输出一下打印结果 : RXActivity: =subscribe2=main 第一次打印
继续往下看 scheduler.scheduleDirect 此方法 传入了Runable 但他不是一个线程,后面可以戳进查看
直接戳进scheduleDirect
RxJava 线程切换流程_第7张图片
两个方法执行的我就贴一起了 ,此处可以看的又new了一个Runable,并且在这个Runable当中调用run,第一次见到这种调用方式,其实后面的代码中这个Runable也仅仅只是当做一个接口使用,在从第一行看吧,此处调用了createWorker() 先记住次处,后面还是要回到这里继续看,戳进createWorker

在这里插入图片描述
抽象方法,我这里写的io 所以进入io的 IoScheduler 进行查看找到createWorker

在这里插入图片描述
RxJava 线程切换流程_第8张图片
需要传入一个CachedWorkerPool 此处就是new出了一个
RxJava 线程切换流程_第9张图片
最后调用了一个get()方法直接戳进
RxJava 线程切换流程_第10张图片
入参
在这里插入图片描述
订阅之后的名称都是此名称,此处new了一个TheadWorker
RxJava 线程切换流程_第11张图片
这就创建成功了,继续回到原处继续看忽略掉没用的调用了w.schedule所以看ThreadWorker当中的schedule方法,ThreadWorker 的schedule方法 在他的父类 NewThreadWorker中 直接戳进
在这里插入图片描述
RxJava 线程切换流程_第12张图片
RxJava使用线程池开了一个线程去做io任务,此处只是线程池执行,看一下线程池创建
RxJava 线程切换流程_第13张图片
RxJava 线程切换流程_第14张图片
开启了一个大小为一的调度池,看一下执行executor.submit(sr) 戳进sr实例
RxJava 线程切换流程_第15张图片
他也是个Runable 重点关注run方法 开始回执 actual.run()->decoratedRun.run(); 看最后的run

在这里插入图片描述
当前对象的source的订阅事件 可以打印第二个结果就是=subscribe1=RxCachedThreadScheduler-1
这就是Rxjava主线程切io线程的过程,后面是io线程切换至主线程
继续回到Demo 在往下看observeOn
在这里插入图片描述
传入了一个要切换线程的Scheduler继续戳进
在这里插入图片描述
只看关键的ObservableObserveOn继续戳进
RxJava 线程切换流程_第16张图片
和之前差不多就不重新在写一遍了看一下super
RxJava 线程切换流程_第17张图片
继承Observable,切换线程的准备工作已经基本完成
触发时机也是subscribe ->subscribeActual 看一下 ObservableObserveOn 中的实现
RxJava 线程切换流程_第18张图片
这里可以看出每observeOn一次都会去创建一个worker 所以每observeOn一次线程都会去改版 而多次subscribeOn只会创建一个worker, 所有每次subscribeOn只会是一个线程 后面是改变subscribe的工作线程状态,又是一个自上而下的next流程。所有next线程会变更。
因为我这个地方是切换至安卓主线程,看一下AndroidSchedulers.mainThread()戳进
RxJava 线程切换流程_第19张图片
这个类不长,但是
AndroidSchedulers
并没有继承Schedulers 而是 HandlerScheduler 才是主角
HandlerScheduler需要传入一个主线程的Looper对象,这一套流程基本上做Android都应该明白,不做过多叙述,继续戳进看 createWorker()
在这里插入图片描述
此处在回到上面看一下执行流程ObservableObserveOn.ObserveOnObserver
RxJava 线程切换流程_第20张图片
最后还是一样调用了schedule方法 所以此处我们只需要关心 HandlerWorkerschedule方法 戳进
RxJava 线程切换流程_第21张图片
其实由此可以看出RxJava在安卓中的线程切换还是利用了Handler,Looper,Message这就是我对RxJava线程切换的心得体会,谢谢阅读。

你可能感兴趣的:(rxjava)