前言:
几个月前本来还是用古老的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 的观察者模式大致如下图:
网友评论