一、什么是RxJava
GitHub地址:https://github.com/ReactiveX/RxJava,有英文能力的小伙伴可以直接从这里入门。
直接照搬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.
译文:它扩展了观察者模式以支持数据/事件序列,并添加了操作符,允许您以声明的方式将序列组合在一起,同时抽象出底层线程、同步、线程安全性和并发数据结构等问题。
然后,这里涉及到两个关键:响应式编程和观察者模式。
1、什么是响应式编程?
2、什么是观察者模式?
比如,读者订阅了连载小说,读者是观察者(订阅者),连载小说是被观察者(发布者)。当连载小说有更新的时候,会发送消息通知读者,读者可以对此做出处理。
二、为何用RxJava
RxJava 到底是什么? —— 一个词:异步
其实, RxJava 的本质可以压缩为异步这一个词。说到根上,它就是一个实现异步操作的库,而别的定语都是基于这之上的。
RxJava 好在哪? —— 一个词:简洁
同样是做异步,为什么人们用它,而不用现成的 AsyncTask / Handler / XXX / ... ?
异步操作很关键的一点是程序的简洁性。RxJava 的优势也是简洁,但它的简洁的与众不同之处在于,随着程序逻辑变得越来越复杂,它依然能够保持简洁。
三、RxJava小案例
对Java8的Stream不熟的话推荐先去学习一下,两者语法上比较相似。
引入依赖。当前最新版为2.2.6,因为使用了Spring Boot所以能够自动找到合适的版本。
Demo。注释都写在代码里面了,直接跑就可以了。
/**
* https://github.com/ReactiveX/RxJava
* @author z_hh
* @time 2019年2月13日
*/
public class RxJavaTest {
public static void main(String[] args) throws Exception {
// 1、初始化Observable,发射数据。这里支持lambda表达式,如Observable.create(e -> e.onNext("xxx"));
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1);// 发射数据,触发Observer的onNext方法执行,可调用多次
emitter.onNext(2);
emitter.onComplete();// 发射完毕,写在后面的onNext将被忽略,触发Observer的onComplete方法执行。同时,与onError互斥,不能同时执行
// emitter.onError(new RuntimeException("发生异常了"));// 发射异常,触发Observer的onError方法执行,与onComplete互斥,不能同时执行
}
})
/*
* 2、线程调度
* subscribeOn()指定的就是发射事件的线程,observerOn()指定的就是订阅者接收事件的线程。
* 多次指定发射事件的线程只有第一次指定的有效,也就是说多次调用 subscribeOn()只有第一次的有效,其余的会被忽略。
* 但多次指定订阅者接收线程是可以的,也就是说每调用一次 observerOn(),下游的线程就会切换一次。
* 内置了很多线程:
* Schedulers.io() 代表io操作的线程, 通常用于网络,读写文件等io密集型的操作;
* Schedulers.computation() 代表CPU计算密集型的操作, 例如需要大量计算的操作;
* Schedulers.newThread() 代表一个常规的新线程;
* AndroidSchedulers.mainThread() 代表Android的主线程
*/
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.newThread())
// 3、操作符,类似Java8的Stream
.filter(i -> i > 0)// 数据过滤
.map(i -> i * 100)// 数据转换
// 4、初始化Observer。可以使用简单版的subscribe(Consumer...),支持lambda表达式,如subscribe(System.out::println);
.subscribe(new Observer<Integer>() {
Disposable disposable;
@Override
public void onSubscribe(Disposable d) {// 建立订阅时
System.out.println("onSubscribe执行了...");
disposable = d;// 可将Disposable保存起来,以实现取消订阅等功能
}
@Override
public void onNext(Integer t) {// emitter.onNext时调用
System.out.println("onNext执行了...收到内容:" + t);
disposable.dispose();// 取消订阅,第二条数据将不会收到
}
@Override
public void onError(Throwable e) {// emitter.onError时调用
System.out.println("onError执行了...");
}
@Override
public void onComplete() {// emitter.onComplete时调用
System.out.println("onComplete执行了...");
}
});
System.out.println("主线程执行完毕!");
System.in.read();
}
}
运行结果。