CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛

android rxjava 优缺点(居然可以这样)android rxjava 原理,android RxJava 线程切换原理探索,

1.给android开发者的rxjava

使用Rxjava进行切换线程很简单,一行代码让耗时操作去子线程执行,再来一行代码回主线程进行结果监听那么问题就来了,Rxjava 是怎么实现的线程切换呢?脑海里的答案是什么?线程池 or Handler 还是什么?。

2.Android rxjava

emmmmm,这个答案 只对了一半我的答案是:耗时操作、主线程操作确实是线程池和handler但是具体的切换操作是 Scheduler它是个抽象类,把耗时操作、结果监听 ,包装成 Runnable丢到Scheduler的实现类去执行。

3.rxjava和rxandroid的区别

为什么说Rxjava的线程切换是由Scheduler完成的呢?来,从源码中找答案的支撑。阅读建议:rxjava代码比较绕,建议静下心来,打着断点一步步看。首先来看一段代码(图1)

4.rxjava的好处

图1通过调用subscribeOn() 和observeOn 方法,完成了线程的切换。众所周知,RxJava是出了名的绕。为了方便分析,将(图1)进行代码拆分(图2)。

5.android rxjava操作符

图2testRxjavaThreadSwitch2 中的代码块调度逻辑与testRxjavaThreadSwitch1 完成相等。分析前我们要先定下分析的方法(图3所示)。

6.rxjava有什么用

图3代码的调用链是由一到四步组合而成链的关键在第四步没有进行subscribe的话,这段Rxjava 代码是不会执行代码真正的执行又是从第四步,一步步的封装打包传递到第一步去可以理解为是U型结构代码链的分析:

7.rxjava使用详解

分析第一步。Observable.create方法。点到源码中去看

8.安卓 rxjava

图4

9.rxjava rxandroid区别

图5总结: 真正的实现类是ObservableCreate。持有的对象source是我们穿进去的 接口类ObservableOnSubscribe。第二步:create.subscribeOn的源码

图6总结:因为第一步的实现类是ObservableCreate,所以create.subscribeOn 实际是ObservableCreate.subscribeOn 返回的函数 new ObservableSubscribeOn<>(this, scheduler) 中的this 是 ObservableCreate对象,scheduler 是我们传入的。

Schedulers.computation()。所以第二步的实现类是ObservableSubscribeOn。第三步:observableonSubscribeOn.observeOn的源码:

图7总结:第二步的实现类是ObservableSubscribeOn所以observableonSubscribeOn.observeOn的调用实际是ObservableSubscribeOn.observeOn。

返回函数new ObservableObserveOn<>(this, scheduler, delayError, bufferSize)中的this是ObservableSubscribeOn,scheduler是我们传入的。

AndroidSchedulers.mainThread()。因此,第三步的实现类是ObservableObserveOn第四步:observableObserveOn.subscribe的源码:

图8总结:因为我们只传入了一个Consumer,所以Rxjava为我们补齐了onError和onComplete第三步的实现类是ObservableObserveOn所以第四步的observableObserveOn.subscribe的调用实际是。

ObservableObserveOn.subscribe至此,调用链串联完成让我们回顾总结下代码真实调用第一步:Observable.create 方法构造个ObservableCreate作为返回对象。

第二步:ObservableCreate.subscribeOn 构造ObservableSubscribeOn作为返回对象第三步:ObservableSubscribeOn.observeOn 构造ObservableObserveOn作为返回对象

第四步:ObservableObserveOn.subscribe。调用subscribe,rxjava代码链 成!!开始执行。执行链的分析:我们先看一段代码:

图9抽象类 Observable是 第一二三步实现类ObservableCreate、ObservableSubscribeOn、ObservableObserveOn的父类,当在实现类中调用(图9)中的subscribe方法。

实际是执行到了 Observable类中的subscribe由subscribe方法来进行各种验证,然后调用subscribeActual来进行统一分发到实现类中,去做具体的实现行为让我们回顾第四步:一次包装:

图10(图10)所示,将我们传入的Consumer包装成LambdaObserver然后传递ObservableObserveOn中的subscribeActual执行代码运行起来打个断点验证下二次包装:。

图11在(图11)中我们可以看到第四步的Consumer包装类LambdaObserver传递了过来再把LambdaObserver包装成ObserveOnObserver(二次包装)ObserveOnObserver持有 LambdaObserver和我们传入的AndroidSchedulers。

交给source(第二步的实现类)ObservableSubscribeOn 执行三次包装:

图12(图12)所示,第二次包装的ObserveOnObserver包装成SubscribeOnObserver。这个时候要注意了!!!!!!!!!!!!!!!!!!!!!

图13scheduler.scheduleDirect(new SubscribeTask(parent))这行代码标识,我们层层包装的observer (SubscribeOnObserver->ObserveOnObserver->LambdaObserver->Consumer)

。要包装成SubscribeTask(继承了Runnable接口) 这个Runnable,交给scheduler调度。

图14看(图14)的红圈,代码已经到子线程执行了加快我们的分析run代码块中的source 是ObservableCreate,而parent对象则是我们层层包裹的observer按照老方法下一步会执行到 。

ObservableCreate.subscribeActual。

图15四次包装:看这个传入的observer是不是我们上层包装的observer到了这层 会在次包装包装后的效果(CreateEmitter->SubscribeOnObserver->ObserveOnObserver->LambdaObserver->Consumer)。

还记得我们代码链分析的第一步吗?(图15)中的source,是我们传入的ObservableOnSubscribe接口类。在回到我们的测试代码

图16(图16)中箭头指向的it,也就是我们所常见的发射器emitter就是我们经过四次包装,最终生成的CreateEmitter至此,切换到子线程的逻辑,跑通了!!!!!!说了这么多才跑通了切换到子线程。

是不是已经进入混沌状态了我们在总结下关键点:Rxjava,会按照我们代码书写顺序生成个调用链,最后的subscribe方法标志着调用链形成然后从下往上,把Consumer经过层层包装传递到顶层作为emitter发射器的实现类。

其中会在ObservableSubscribeOn.subscribeActual方法中,生成个SubscribeTask的Runnable将代码的执行切换到子线程我们继续,攻坚最后一步子线程在切换到主线程。

在观察(图16),发射器调用了it.onNext(“111111”)。因为发射器的实现类是CreateEmitter。

图17还记得通过四次包装的observer吗?接下来我们拆快递了(CreateEmitter->SubscribeOnObserver->ObserveOnObserver->LambdaObserver->Consumer)

。快递长这样。剩下的就不一步步分析了,打着断点一步步跟就行。接下来只分析关键点。拆快递拆到ObserveOnObserver层,看(图18)

图18经过onNext的调用后,执行schedule()方法,交给worker进行调用,worker是我们传入的AndroidSchedulers.mainThread()实现类是HandlerScheduler。

图19(图19)中的红框,老哥们看了都会懂吧!此时还在子线程执行呢马上要把我们的数据包装成ScheduledRunnable作为个message,传递到handler中执行了当包装的ScheduledRunnable的run执行的时候代表什么???。

代表已经回到主线程了后续的代码执行会继续进行对observer拆包最终把数据回调到我们subscribe传入的Consumer中至此我们这篇文章的探索的Rxjava线程切换原理在源码层需要找寻的答案,已经找到了。

最后的最后在总结下Rxjava,会按照我们代码书写顺序生成个调用链,最后的subscribe方法标志着调用链形成然后从下往上,把Consumer经过层层包装传递到顶层作为emitter发射器的实现类其中会在。

ObservableSubscribeOn.subscribeActual方法中,生成个SubscribeTask的Runnable将代码的执行切换到子线程发射器emitter调用onNext,开始对Consumer的包装进行拆包。

当拆包拆到ObserveOnObserver层时会有个worker调度,也就是开始文章开篇说的Scheduler生成个Runnable的message交给handler分发将代码的执行切换到主线程在总结的精炼点:

Rxjava,通过把要切换线程的任务包装成Runnable交给Scheduler调度具体是线程池或handler,交由Scheduler实现类实现写在最后Rxjava源码很绕很复杂当我们耐心跑通一个流程后,其他的各种操作符的理解都会变得容易起来。

耐下心来,细读源码,与大神在不同时空的思想碰撞,获益良多

© 版权声明
THE END
喜欢就支持一下吧
点赞0赞赏 分享
相关推荐
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容