Rxjava概述
a library for composing asynchronous and event-based programs using observable sequences for the Java VM
翻译一下大概是,一个在JVM上为了构建(异步、基于事件、并使用了观察者序列的)程序的库。
响应式编程是一种面向数据流和变化传播的编程范式。
Eventbus也是基于观察者模式的,Rxjava更加简洁,目前基本可以用Rxjava代替。
github:https://github.com/ReactiveX/RxJava
主要接口
Rxjava1主要接口:
被观察者:Observable
观察者:Observer/Subscriber
中间处理者:Operator
Rxjava2主要接口:
被观察者:Publisher
观察者:Subscriber,Flowable
Rxjava1的简单应用
被观察者Observable:
Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
//传递数据流
subscriber.onNext("***");
//执行数据流处理
subscriber.onCompleted();
}
});
观察者Observer或者Subscriber(多几个回调函数):
Subscriber<String> subscriber = new Subscriber<String>() {
//事件处理完成回调
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
//接收数据流,事件处理
@Override
public void onNext(String s) {
}
};
被观察者订阅观察者:
/*
* 被观察者运行在io线程,效率高
* 观察者运行在安卓主线程
*/
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
Rxjava2
官方已终止rxjava1的维护。
Rxjava2在Rxjava1的基础上有了很多变化,我们按顺序来了解Rxjava2的所有特性。
被观察者:
Flowable | 0-n个数据流 | 支持响应式流 | 支持背压 |
Observable | 0-n个数据流 | 不支持背压 | |
Single | 1个数据流 | 一个对象或者error | |
Completable | 1个数据流 | 仅一个成功或失败标志 | |
Maybe | 1个数据流 | 一个对象或者error |
背压是指在观察者模式中,被观察者发送数据的速度比观察者处理速度快很多的情况下,告知上游被观察者放慢速度的策略。
组装时间(Assembly time):
这是一个观察者与被观察者的中间过程,通过一些运算符来对数据流进行简单处理。组装有可能会和被观察者在一个线程中非并发执行。
操作符:map,filter
调度器Schedulers:
Schedulers.io() 运行io或阻塞操作的线程
Schedulers.computation() 需要大量计算的线程
Schedulers.newThread() 常规线程
Schedulers.trampoline() 测试用常规线程
AndroidSchedulers.mainThread() Android主线程
操作符:
flatMap逐层依赖(concatMap,switchMap)
Flowable.range(1, 10)
.flatMap(v ->
Flowable.just(v)
.subscribeOn(Schedulers.computation())
.map(w -> w * w)
)
.blockingSubscribe(System.out::println);
concat(flowable,biflowable):实现被观察者事件的顺序执行。
zip:合并被观察者,共同更新UI
订阅:
订阅方式和Rxjava1类似
Flowable.just("Hello world")
.subscribe(new Consumer<String>() {
@Override public void accept(String s) {
System.out.println(s);
}
});
也可以直接在Subscription直接添加被观察者
private CompositeSubscription subscription;
subscription.add(flowable);