May you return with a young heart after years of fighting.
愿你出走半生,归来仍是少年。
1.RxJava2简介
什么是Rxjava2?
Rxjava是一个异步框架,功能和handler类似,采用链式调用。基于观察者模式,有三个重要角色:被观察者(Observable)、订阅(subscribe)、观察者(Observer)。
核心思想:被观察者和观察者通过订阅产生一种关系(observable.subscribe(observer)),当observable发生改变,通知observer,observer对应做出相应的回应。
比如:电视节目是被观察者,观众是观察者,电视节目和观众通过subscribe产生订阅关系,电视节目更新了,通知观众去观看新节目。
2.角色创建
2.1 创建被观察者
Observable<String> tv= Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
for (int i=1;i<4;i++){
Log.i("Rxjava","庆余年,我更新了第"+i+"集");
emitter.onNext(i);//发射数据
}
}
})
调Observable的create()方法传入ObservableOnSubscribe对象,并重写subscribe()方法,在subscribe()中有一个ObservableEmitter发射器,对象调用发射器的onNext(),把被观察者(Observable)的事件发送出去。
2.2创建观察者
Observer<String> audi= new Observer<Integer>() {
//当Observer和Observable订阅的时候调用
@Override
public void onSubscribe(Disposable d) {
Log.d("Rxjava","我是观众,我和新剧订阅了");
}
//对Observable中的emitter.onNext()发射出来的事件i进行处理
@Override
public void onNext(Integer i) {
Log.d("Rxjava","我是观众,我看了新剧第"+i+"集");
}
//出现错误
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
//Observable发送来的事件全部处理完成的时候调用
@Override
public void onComplete() {
Log.d("Rxjava","我是观众,我把更新新剧看完了。");
}
};
注意:onError()和onComplete()互斥,只会调用一个。
2.3 订阅关系
tv.observeOn(AndroidSchedulers.mainThread());//在主线程观察事件
.subscribeOn(Schedulers.newThread());//在子线程订阅
.subscribe(audi);//形成订阅关系
2.4 链式调用
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
for (int i=1;i<4;i++){
Log.i("Rxjava","庆余年,我更新了第"+i+"集");
emitter.onNext(i);//发射数据
}
}
})
.observeOn(AndroidSchedulers.mainThread());//在主线程观察事件
.subscribeOn(Schedulers.newThread());//在子线程订阅
.subscribe(new Observer<Integer>() {//形成订阅关系
//当Observer和Observable订阅的时候调用
@Override
public void onSubscribe(Disposable d) {
Log.d("Rxjava","我是观众,我和新剧订阅了");
}
//对Observable中的emitter.onNext()发射出来的事件i进行处理
@Override
public void onNext(Integer i) {
Log.d("Rxjava","我是观众,我看了新剧第"+i+"集");
}
//出现错误
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
//Observable发送来的事件全部处理完成的时候调用
@Override
public void onComplete() {
Log.d("Rxjava","我是观众,我把更新新剧看完了。");
}
});
3.Rxjava在Android中使用(Retrofit + Rxjava)
3.1添加依赖与网络权限
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
<uses-permission android:name="android.permission.INTERNET"/>
3.2创建接口
public interface BaiduService {
@GET(".")
Observable<String> getBaidu();
}
3.2 Retrofit + Rxjava调用
创建Observable的过程
//创建Retrofit
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://www.baidu.com")//请求URL
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
//创建接口引用
BaiduService baiduService = retrofit.create(BaiduService.class);
//调用接口的方法,得到Observable
Observable<String> baidu = baiduService.getBaidu();
由于Observer的四个方法没必要全部调用,先对Observer代码优化
public abstract class BaseObserver<T> implements Observer<T> {
public abstract void onSuccess(T t);
public abstract void onFail(Throwable e);
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(T t) {
onSuccess(t);
}
@Override
public void onError(Throwable e) {
onFail(e);
}
@Override
public void onComplete() {
}
}
订阅方法1
baidu.subscribeOn(Schedulers.newThread())//子线程订阅访问网络
.observeOn(AndroidSchedulers.mainThread())//主线程观察
.subscribe(new BaseObserver<String>() {//产生订阅关系
//请求成功
@Override
public void onSuccess(String s) {
Log.v("Rxjava",s);
}
//请求异常
@Override
public void onFail(Throwable e) {
Log.v("Rxjava",e.getMessage());
}
});
订阅方法2
CompositeDisposable cd = new CompositeDisposable();
cd.add(baidu
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
//带一个Consumer参数的方法表示下游只关心onNext事件, 其他的事件不关心,就可以这么写
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
Log.v("Rxjava",s);
}
}));
//解除订阅关系
cd.dispose();
4.RxJava2常用操作符
4.1操作符——create(参考前面的用法)
4.2操作符——just
just作用就是一旦订阅,立马发出消息
Observable.just("Rxjava").subscribe(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);//Rxjava
}
})
4.2操作符——from
对数组或者列表的发送
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 20; i++) {
list.add(i);
}
//fromArray接收列表或者数组
Observable.fromArray(list).subscribe(new Consumer<List<Integer>>() {
@Override
public void accept(List<Integer> integers) throws Exception {
for (Integer i:list) {
Log.e("Rxjava",i+"");
}
}
})
4.2操作符——map与flatMap
map对传输数据转型,Integer转String
Observable.range(10, 5)//10,11,12,14,15
.map(new Function<Integer, String>() {
@Override
public String apply(Integer integer) {
return String.format("Integer %s 变String %s", integer, integer);
}
}).subscribe(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
})
——————————————————————————————输出结果————————————————————————————————————————————————————
Integer 10 变String 10
Integer 11 变String 11
Integer 12 变String 12
Integer 13 变String 13
Integer 14 变String 14
flatMap将一个发送事件的上游Observable变换为多个发送事件的Observables,然后将它们发射的事件合并后放进一个单独的Observable里. flatMap并不保证事件的顺序,如果要保证事件的顺序,使用concatMap。
Observable.just(1, 2, 3).flatMap(new Function<Integer, Observable<String>>() {
@Override
public Observable<String> apply(Integer integer) throws Exception {
final List<String> list = new ArrayList<>();
for (int i = 0; i < 3; i++) {
list.add("Integet = " + integer + ", i = " + i);
}
//注意:这里返回到下游的是Observable,list长度为3,每次返回3个到下游
return Observable.fromIterable(list);
}
}).subscribe(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
——————————————————————————————输出结果————————————————————————————————————————————————————
Integer = 1, i = 0
Integer = 1, i = 1
Integer = 1, i = 2
Integer = 2, i = 0
Integer = 2, i = 1
Integer = 2, i = 2
Integer = 3, i = 0
Integer = 3, i = 1
Integer = 3, i = 2