这篇文章基于RxJava2.0
RxJava是什么?
官网说RxJava是一个可观测的序列来组成异步的额,基于事件的库,简单来说,它就是一个实现异步的库,可以代替Android的API如AsyncTask ,Handler等等。
RxJava为什么好?
RxJava其实就是提供一套异步编程的API,这套API是基于观察者模式的,而且是链式调用的,所以使用RxJava编写的代码逻辑会非常简洁。
观察者模式:
定义:对象间一种一对多的关系,使得每当一个对象改变,则所有依赖于它的对象都会得到通知并被自动更新。
作用:解耦,UI层与具体的业务逻辑解耦。
官方支持时间?
官方支持更新到2020年12月31日,没关系的,还有Rxjava3。
使用场景?
可以进行数据库的写入,大图片的载入,文件压缩和解压等各种需要放在后台工作的耗时操作,都可以使用RxJava来实现,可以使用RxJava来实现响应式编程。
如何使用?
添加依赖:
//RxJava2
implementation 'io.reactivex.rxjava2:rxjava:2.2.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
通过RxJava最简单的一个例子引出它的三个基本元素:观察者,被观察者和订阅。
被观察者
Observable observable = Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter emitter) throws Exception {
emitter.onNext("Hello");//发送事件时,观察者会回调onNext方法
emitter.onComplete();//这个顺序不能颠倒,如果onNext方法放在最后,onNext就不会执行了
}
}).subscribeOn(Schedulers.io())//实际项目中网络请求在io线程
.observeOn(AndroidSchedulers.mainThread());//这里意为观察者在主线程更新UI
create是RXJava中最基本的操作符,
观察者
Observer observer = new Observer() {
@Override
public void onSubscribe(Disposable d) {//这个方法在订阅前就会被调用
Log.i("log", "onSubscribe->" + d);
//d.dispose();//取消发射事件
}
@Override
public void onNext(String s) {
Log.i("log", "onNext->" + s);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
};
订阅观察者:
observable.subscribe(observer);
被观察者订阅观察者后,observable中的方法会被立刻回调 。
除了Observable,还有其它4个被观察者可以操作,一共5种
接下来看看其它4种被观察者是如何使用的
被观察者(背压)Flowable
Flowable flowable = Flowable.create(new FlowableOnSubscribe() {
@Override
public void subscribe(FlowableEmitter emitter) throws Exception {
for (int i = 0; i < 1000000000; i++) {
emitter.onNext(i);
//这里还是发射了20条数据
Log.d("log", "subscribe: " + i);
}
emitter.onComplete();
}
}, BackpressureStrategy.BUFFER).subscribeOn(Schedulers.io());
观察者(背压)
Subscriber subscriber = new Subscriber() {
@Override
public void onSubscribe(Subscription s) {
Log.d("log", "onSubscribe");
//这里体现的是响应式拉取
//s.request(Long.MAX_VALUE);//指定下游(观察者)接收数据的最大值
s.request(10);
}
@Override
public void onNext(Integer integer) {
//拉取10条数据
Log.d("log", "onNext: " + integer);
}
@Override
public void onError(Throwable t) {
}
@Override
public void onComplete() {
Log.d("log", "onComplete");
}
};
被观察者(Single)
Single.create(new SingleOnSubscribe() {
@Override
public void subscribe(SingleEmitter emitter) throws Exception {
emitter.onSuccess("消息");
}
}).subscribe(new SingleObserver() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onSuccess(String s) {
}
@Override
public void onError(Throwable e) {
}
});
被观察者(Completable)
Completable.create(new CompletableOnSubscribe() {
@Override
public void subscribe(CompletableEmitter emitter) throws Exception {
emitter.onComplete();
emitter.onError(new Exception());
}
});
被观察者(Maybe)
Maybe.create(new MaybeOnSubscribe() {
@Override
public void subscribe(MaybeEmitter emitter) throws Exception {
emitter.onSuccess("消息");
emitter.onComplete();
emitter.onError(new Exception());
}
});
操作符:操作符包括创建操作符,转换操作符,组合操作符,功能操作符,过滤操作符,条件操作符。
举个just的例子
just和creat一样,也是创建,只是最多不能超过10个参数
//可以传入多个参数
//Observable.just("a",1,2,"b").subscribe(new Observer