close
当前位置: 物联网在线 > 技术文库 > android >

RxAndroid深入理解

现在项目里面大多都已经使用了rxjava, 因此对于很多rxjava的扩展库,也都可以使用在项目里了。

RxAndroid 已经成为标配了,基本只要使用了Rxjava, 你肯定能看见RxAndroid的身影。

使用场景: Observable.just("one", "two", "three", "four", "five") .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(/* an Observer */);

很简单,就是指定到主线程上,即UI线程上,所以subscribe里的内容就会执行在主线程上。

或者其他线程的Looper Looper backgroundLooper = // ... Observable.just("one", "two", "three", "four", "five") .observeOn(AndroidSchedulers.from(backgroundLooper)) .subscribe(/* an Observer */)

这种使用方式,就是把后台线程所绑定的Looper作为AndroidSchedulers的参数, 那么这时实际上等同于 :

... observeOn(Scheduler.io());

因此这种方式下,subscribe 里的代码是执行在backgroundLooper所绑定的线程。

代码结构:

RxAndroid深入理解

Paste_Image.png

实现分析:

既然使用的入口是AndroidScheduler 那就重这里开始分析。

首先看看AndroidScheduler的创建:

RxAndroid深入理解

Paste_Image.png

搭眼一看,饿汉式的单例, 并且这个单例是使用AtomicReference的,原子操作,保证多线程情况下,线程获取的值都是最新的,正确的。实例化用到了RxAndroidPlugins, 看下:

RxAndroid深入理解

Paste_Image.png

同样是AtomicReference ,同样是单例。

RxAndroid深入理解

Paste_Image.png

又引用到RxAndroidSechedulersHook

RxAndroid深入理解

Paste_Image.png

这是个什么鬼,搞了半天最后getMainThreadScheduler() 返回null. 再回头看看前面AndroidScheduler实例化的地方。

RxAndroid深入理解

Paste_Image.png

soga, 空的话直接返回一个LooperScheduler, 否则直接使用。

这就是问题了,为什么要绕这么大一圈?

我觉得秘密在RxAndroidSchedulersHook里的一个方法,如下:

RxAndroid深入理解

Paste_Image.png

那么这个方法在哪里被调用了呢? 这个问题先放着,后面会讲到。

先来看看注释,大概的意思是,该方法在把action 交给Scheduler处理之前被执行, 可以用于

包装/装饰/日志记录(翻译过来好别扭!), 默认值只是传递作用,直接返回。

如果你仔细看看Rxjava RxJavaSchedulersHook 类,你会发现如出一辙, 一模一样!!!

连注释都长一样!

这里是把UI线程的Looper作为参数创建了一个LoopScheduler.

再进去看看LooperScheduler:

RxAndroid深入理解

Paste_Image.png

LooperScheduler 继承自Scheduler, 因此必须实现createWorker方法。

Worker是个什么东东?

RxAndroid深入理解

Paste_Image.png

实际上是Scheduler里 的一个静态抽象类,实现了Subscription接口,因此也就有unSubscriber方法。

可以取消订阅,但是Worker并没有实现取消订阅方法,而是交给子类去实现,比如这里的HandlerWorker就实现了Worker抽象类,下面是截取的核心部分:

RxAndroid深入理解

Paste_Image.png

HandlerWorker实现了schedule方法,一个是有延时的,一个是无延时的。 从代码看首先判断了是否被取消订阅了, 取消了则直接返回,不做任何处理,否者接着走。

哎呦喂! 哎呦喂! 这不是RxAndroidSchedulersHook 里的那个我们之前放着的方法吗?

在这里被调用了。

接着走这里又跳出来个ScheduledAction, 贴出代码!

RxAndroid深入理解

Paste_Image.png

RxAndroid深入理解

Paste_Image.png

从代码中不难看出, 在LooperScheduler 中创建的handler, 交给HandlerWorker后又交给了ScheduledAction。 该类实现了Runnable 接口,run方法里面调用了action.call() ;看来这里才是真正调用的地方,然后如果发生异常就调用RxjavaPlugin 触发错误处理。

ScheduledAction同样实现了Subscription接口, 取消也很简单,handler removeCallbacks(this).。

看完了ScheduledAction是不是感觉一目了然了,接着上面HandlerWorker的schedule方法讲,


(责任编辑:ioter)

用户喜欢...

Android AsyncTask完全解析,带你从源码的角度彻底理解

我们都知道,Android UI是线程不安全的,如果想要在子线程里进行UI操作,就需要借助Android的异步消息处理机制。 不过为了更加方便我们在子线程中更新UI元素,Android从1.5版本就引入了一个...


Android EventBus3.0 深入了解

下面就其原理和使用方法做更深入细致的了解。 EventBus设计模式 EventBus is an open-source library for Android using the publisher/subscriber pattern for loose coupling 这句话是greenrobot官网对EventBus的解释。 EventB...


深入理解 ButterKnife,让你的程序学会写代码

话说我们做程序员的,都应该多少是个懒人,我们总是想办法驱使我们的电脑帮我们干活,所以我们学会了各式各样的语言来告诉电脑该做什么——尽管,他们有时候也会误会我们的意思。...


你真的理解Android AIDL中的in,out,inout么?

这其实是一个很小的知识点,大部分人在使用AIDL的过程中也基本没有因为这个出现过错误,正因为它小,所以在大部分的网上关于AIDL的文章中,它都被忽视了——或者并没有,但所占篇幅甚...


Android状态栏微技巧,带你真正理解沉浸式模式

记得之前有朋友在留言里让我写一篇关于沉浸式状态栏的文章,正巧我确实有这个打算,那么本篇就给大家带来一次沉浸式状态栏的微技巧讲解。 其实说到沉浸式状态栏这个名字我也是感到...


RxAndroid 2.0 学习笔记

Rxjava 2.x正式版出来已经快两个月了。在之前的项目中也在使用Rx。但却一直没有时间对整个的知识进行梳理,恰好今天抽出时间,也系统的再学习一遍RxJava/RxAndroid RxJava的使用 一、观察者/被...


gradle深入理解以及在android studio中的使用

Gradle是一个基于Apache ant和Apache maven概念的项目自动化构建工具。它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的xml,当前其支持的语言限于java、groovy和scala[3],计划未来...