RxJava在Android开发中的应用与原理剖析

更新:11-16 神话故事 我要投稿 纠错 投诉

大家好,关于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

用户评论

惯例

终于有机会好好学习一下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位网友表示赞同!

她最好i

希望能看到一些关于RxAndroid性能优化的建议和最佳实践

    有15位网友表示赞同!

安陌醉生

对于初学者来说,这篇博客能提供足够的指导吗?是否能用更通俗易懂的语言解释

    有9位网友表示赞同!

晨与橙与城

期待作者分享更多关于RxAndroid的使用经验和技巧

    有14位网友表示赞同!

【RxJava在Android开发中的应用与原理剖析】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:揭秘远方好物:品质保证与真实体验分享 下一篇:酒后不再分享朋友圈,揭秘社交隐私新趋势