大家好,关于RxJava在Android开发中的应用与原理剖析很多朋友都还不太明白,今天小编就来为大家分享关于的知识,希望对各位有所帮助!
.observeOn(AndroidSchedulers.mainThread())
.subscribe(/* 观察者*/);很简单,分配给主线程,即UI线程,所以subscribe中的内容会在主线程上执行。
或者其他线程的Looper
Looper背景Looper=//.
Observable.just("一", "二", "三", "四", "五")
.observeOn(AndroidSchedulers.from(backgroundLooper))
.subscribe(/* an Observer */) 的使用方法是使用后台线程绑定的Looper作为AndroidSchedulers的参数,那么这实际上相当于:
.
observeOn(Scheduler.io());因此,这样一来,subscribe中的代码就在backgroundLooper绑定的线程中执行了。
代码结构:
Paste_Image.png
实现分析:
由于使用的入口是AndroidScheduler,所以我们从这里开始分析。
首先看AndroidScheduler的创建:
Paste_Image.png 一看就是一个中国式的单例,而且这个单例使用了AtomicReference这种原子操作,保证在多线程的情况下,线程获取到的值是最新的、正确的。 RxAndroidPlugins用于实例化,看一下:
Paste_Image.png 也是一个AtomicReference 和一个单例。
Paste_Image.png 指的是RxAndroidSchedulersHook
Paste_Image.png 这到底是什么?搞了好久,getMainThreadScheduler()终于返回null了。我们回顾一下前面实例化AndroidScheduler的地方。
Paste_Image.pngsoga,如果为空则直接返回一个LooperScheduler,否则直接使用。
这就是问题了,为什么要绕这么大一圈?
我认为秘密在于RxAndroidSchedulersHook中的一个方法,如下:
粘贴_图像.png
那么这个方法是在哪里调用的呢?这个问题先放到一边,等以后再说。
我们先来看看评论。大致意思是这个方法在action交给Scheduler处理之前执行。它可用于
包装/装饰/日志记录(翻译的太别扭了!),默认值只是一个传递函数,直接返回。
如果你仔细看看Rxjava RxJavaSchedulersHook 类,你会发现它是一模一样的!
连评论都一样!
这里,使用UI线程的Looper作为参数创建了一个LoopScheduler。
再进去看看LooperScheduler:
Paste_Image.pngLooperScheduler继承自Scheduler,所以必须实现createWorker方法。
什么是工人?
Paste_Image.png实际上是Scheduler中的一个静态抽象类,它实现了Subscription接口,因此它也有unSubscriber方法。
可以取消订阅,但是Worker并没有实现取消订阅方法,而是留给子类来实现。比如这里的HandlerWorker就实现了Worker抽象类。以下是拦截的核心部分:
Paste_Image.pngHandlerWorker实现了schedule方法,一种是有延迟的,一种是不延迟的。从代码来看,首先判断订阅是否已被取消订阅。如果取消则直接返回,不做任何处理。否则,它将继续下去。
哎哟!哎哟!这不是我们之前放在RxAndroidSchedulersHook中的方法吗?
被称为这里。
然后到这里又弹出一个ScheduledAction,贴出代码吧!
Paste_Image.pngPaste_Image.png 从代码中不难看出,LooperScheduler中创建的handler先交给HandlerWorker,再交给ScheduledAction。该类实现了Runnable接口,run方法中调用了action.call();看来这才是真正的调用地方,然后如果出现异常,就会调用RxjavaPlugin来触发错误处理。
ScheduledAction也实现了Subscription接口,取消也很简单,handlerremoveCallbacks(this).
看完ScheduledAction,是不是觉得一目了然呢?接下来我们来说说上面HandlerWorker的schedule方法,
之后从Message池中获取一条Message并将该消息的Callback参数设置为ScheduledAction的实例,然后handler.sendMessageDelayed(message, unit.toMillis(delayTime));延迟发送消息。看到这里你应该明白了,handler就是用来发送消息到looper所在线程的!因此,你传入的Looper绑定在哪个线程中,我们的action(订阅者)就会在那个线程中执行!
而我们通常使用AndroidScheduler.mainThread();默认传递的是UI线程的Looper!
有朋友说,不是啊,我没有看到消息接收和处理的地方啊!楼主你就是个傻子啊!
其实这是因为你对handler理解不够:
(Handler.java)Paste_Image.png 你看到了吗?这里是handler接收Looper分配的消息的处理过程。首先判断msg是否有回调。如果有,则不会调用handleMessage(msg),而是调用handlerCallback(msg);这样就调用了runnable的run方法。这就是ScheduledAction 的run() 方法。
粘贴_图像.png。
RxAndroid中还有一个类没讲 MainThreadSubscription, 下篇文章会讲下RxBinding,里面会讲到,这里就不多说了。
http://www.jianshu.com/p/ded241051b61
【RxJava在Android开发中的应用与原理剖析】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于有机会好好学习一下RxAndroid了,一直在想怎么优雅地处理异步操作
有15位网友表示赞同!
我对Android开发一直很感兴趣,RxAndroid能讓我更精通Reactive编程吗?
有7位网友表示赞同!
这篇博客内容详细介绍了吗?我想了解RxJava的具体应用场景在Android项目中
有19位网友表示赞同!
希望这篇博客能解释清楚RxAndroid的原理,我也想深入理解它的优势
有16位网友表示赞同!
我一直用的异步解决方案感觉有点繁琐,看看RxAndroid能不能提高开发效率
有11位网友表示赞同!
听说RxAndroid可以简化UI交互,我期待看到具体的代码示例
有19位网友表示赞同!
我已经开始学习RxJava了,这篇博客能帮助我更好地理解如何在Android项目中使用它吗?
有14位网友表示赞同!
我需要提升Android开发水平,这篇文章刚好是必读资料!
有11位网友表示赞同!
希望能有对不同类型的异步处理场景的详细分析,以及相应的RxAndroid解决方案
有8位网友表示赞同!
学习新技术的过程总是充满挑战,感谢作者分享这篇 insightful 的文章!
有6位网友表示赞同!
我已经习惯了传统的Android编程方法,期待看到RxAndroid带来的全新思路
有20位网友表示赞同!
希望能够深入了解RxJava和RxAndroid之间的交互关系,以及如何进行代码开发
有18位网友表示赞同!
想要学习如何使用RxAndroid来构建高效、可维护的Android应用
有20位网友表示赞同!
这篇博客能否提供一些实践案例或者实战技巧?
有13位网友表示赞同!
我对Reactive编程的概念很模糊,希望能够从这篇博客中获得清晰的理解
有5位网友表示赞同!
希望能看到一些关于RxAndroid性能优化的建议和最佳实践
有15位网友表示赞同!
对于初学者来说,这篇博客能提供足够的指导吗?是否能用更通俗易懂的语言解释
有9位网友表示赞同!
期待作者分享更多关于RxAndroid的使用经验和技巧
有14位网友表示赞同!