美文网首页
什么是RxJava?尤其是对安卓开发者来说到底该如何理解RxJa

什么是RxJava?尤其是对安卓开发者来说到底该如何理解RxJa

作者: 空空大师丶 | 来源:发表于2017-08-15 10:53 被阅读0次

    前言:

    几个月前本来还是用古老的Xutils做一些开发,一夜间~~突然RxJava+Retrofit+okHttp 突然就火了起来.作为一个爱学习的学习生.不得不去看一些Github来做一些了解~~

    一、什么是RxJava

    先看看Github吧 Github

    RxJava is a Java VM implementation of Reactive Extensions: a library for composing asynchronous and event-based programs by using observable sequences.

    翻译:RxJava是一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库

    It extends the observer pattern to support sequences of data/events and adds operators that allow you to compose sequences together declaratively while abstracting away concerns about things like low-level threading, synchronization, thread-safety and concurrent data structures.

    翻译:它扩展了观察者模式,以支持数据/事件的序列,并添加了允许您以声明的方式组合组合序列的操作符,同时抽象出对低层次线程、同步、线程安全和并发数据结构的关注。

    说穿了,RxJava就是一个实现异步操作的库,这么一总结就容易明白了吧.

    二、How to Use?

    1.在Android Studio下 直接引入 

    compile"io.reactivex.rxjava2:rxjava:2.1.2"

    2.像初学Java时一样对世界说 Hello World!

    import io.reactivex.*;

    public class HelloWorld{

    public static void main(String[]args) {

           Flowable.just("Hello world").subscribe(System.out::println);    

           }

    }

    3.模仿下网络连接等情况

    importio.reactivex.schedulers.Schedulers;

    Flowable.fromCallable(()->{

    Thread.sleep(1000);//模拟网络连接等操作

    return"Done";

    })

    .subscribeOn(Schedulers.io())

    .observeOn(Schedulers.single())

    .subscribe(System.out::println,Throwable::printStackTrace);

    Thread.sleep(2000);//等待线程结束

    三、Why Use It?

    同样进行异步操作,RxJava与Handler以及AsyncTask相比,RxJava带来的就2个字!简洁!!!

    异步操作关键的一点是代码的简洁性,因为在调度过程比较复杂的情况下,异步代码对一部分人来说既难写也难懂。 

    Android 创造的AsyncTask和Handler,其实都是为了让异步代码更加简洁。

    RxJava 的优势也是简洁,但它的简洁的与众不同之处在于,随着程序逻辑变得越来越复杂,它依然能够保持简洁。

    Demo1:

    Demo2:

    或许你会说Demo2用了RxJava怎么代码量还变多了.

    注意!!我说的是逻辑的简洁

    而不是单纯的代码量少(逻辑简洁才是提升读写代码速度的必杀技对不?)。观察一下你会发现, RxJava 的这个实现,是一条从上到下的链式调用,没有任何嵌套,这在逻辑的简洁性上是具有优势的。当需求变得复杂时,这种优势将更加明显。

    另外,如果你的 IDE 是 Android Studio ,其实每次打开某个 Java 文件的时候,你会看到被自动 Lambda 化的预览,这将让你更加清晰地看到程序逻辑

    四、原理解析

    RxJava 的异步实现,是通过一种扩展的观察者模式来实现的。什么是观察者模式

    观察者模式 -------fromhttp://blog.csdn.net/lemon_tree12138/article/details/45483511

    先简述一下观察者模式,已经熟悉的可以跳过这一段。

    观察者模式面向的需求是:A 对象(观察者)对 B 对象(被观察者)的某种变化高度敏感,需要在 B 变化的一瞬间做出反应。举个例子,新闻里喜闻乐见的警察抓小偷,警察需要在小偷伸手作案的时候实施抓捕。在这个例子里,警察是观察者,小偷是被观察者,警察需要时刻盯着小偷的一举一动,才能保证不会漏过任何瞬间。程序的观察者模式和这种真正的『观察』略有不同,观察者不需要时刻盯着被观察者(例如 A 不需要每过 2ms 就检查一次 B 的状态),而是采用注册(Register)或者称为订阅(Subscribe)的方式,告诉被观察者:我需要你的某某状态,你要在它变化的时候通知我。 

    Android 开发中一个比较典型的例子是点击监听器OnClickListener。对设置OnClickListener来说,View是被观察者,OnClickListener是观察者,二者通过setOnClickListener()方法达成订阅关系。订阅之后用户点击按钮的瞬间,Android Framework 就会将点击事件发送给已经注册的OnClickListener。采取这样被动的观察方式,既省去了反复检索状态的资源消耗,也能够得到最高的反馈速度。当然,这也得益于我们可以随意定制自己程序中的观察者和被观察者,而警察叔叔明显无法要求小偷『你在作案的时候务必通知我』。

    OnClickListener 的模式大致如下图:

    如图所示,通过setOnClickListener()方法,Button持有OnClickListener的引用(这一过程没有在图上画出);当用户点击时,Button自动调用OnClickListener的onClick()方法。另外,如果把这张图中的概念抽象出来(Button-> 被观察者、OnClickListener-> 观察者、setOnClickListener()-> 订阅,onClick()-> 事件),就由专用的观察者模式(例如只用于监听控件点击)转变成了通用的观察者模式。如下图:

    而 RxJava 作为一个工具库,使用的就是通用形式的观察者模式。

    RxJava 的观察者模式

    RxJava 有四个基本概念:

    1.Observable(可观察者,即被观察者)

    2.Observer(观察者)

    3.subscribe(订阅)

    4.事件。

    Observable和Observer通过subscribe()方法实现订阅关系,从而Observable可以在需要的时候发出事件来通知Observer。

    与传统观察者模式不同, RxJava 的事件回调方法除了普通事件onNext()(相当于onClick()/onEvent())之外,还定义了两个特殊的事件:onCompleted()和onError()。

    onCompleted(): 事件队列完结。RxJava 不仅把每个事件单独处理,还会把它们看做一个队列。RxJava 规定,当不会再有新的onNext()发出时,需要触发onCompleted()方法作为标志。

    onError(): 事件队列异常。在事件处理过程中出异常时,onError()会被触发,同时队列自动终止,不允许再有事件发出。

    在一个正确运行的事件序列中,onCompleted()和onError()有且只有一个,并且是事件序列中的最后一个。需要注意的是,onCompleted()和onError()二者也是互斥的,即在队列中调用了其中一个,就不应该再调用另一个。

    RxJava 的观察者模式大致如下图:

    相关文章

      网友评论

          本文标题:什么是RxJava?尤其是对安卓开发者来说到底该如何理解RxJa

          本文链接:https://www.haomeiwen.com/subject/hcymrxtx.html