说明:主要借鉴了大神的观点。
知识来源1
知识来源2
在Rxjava1.0中,背压处理由于并未独立出来。因此有的支持有的不支持。但在Rxjava2.0,出现了两种观察者模式:
Observable(被观察者)/Observer(观察者)
Flowable(被观察者)/Subscriber(观察者)
上面的是Rxjava1.0中背压处理的操作入口,下面的则是Rxjava2.0之后背压处理的更进一步优化。它将背压处理单独拿出来进行操作,这样有了更好的分类。即在2.0中出现了两种(非背压和背压)。
Flowable.range(1, 4).subscribe(new Subscriber() {
Subscription subscription;
@Override
public void onSubscribe(Subscription s) {
Log.e("rx2_test", "onSubscribe");
subscription = s;
//这里可进行一些初始化操作
subscription.request(1);
}
@Override
public void onNext(Integer integer) {
Log.e("rx2_test", "onNext:" + integer);
subscription.request(1);
}
@Override
public void onError(Throwable t) {
Log.e("rx2_test", "onError:" + t.getMessage());
}
@Override
public void onComplete() {
Log.e("rx2_test", "onComplete");
}
});
Flowable.just(1, 2, 3, 4, 5)
.subscribe(new Consumer() {
@Override
public void accept(Integer integer) throws Exception {
Log.e("rx2_test", "actionChange:" + integer);
}
});
Action是RxJava 的一个接口,常用的有Action0和Action1。
Action0: 它只有一个方法 call(),这个方法是无参无返回值的;由于 onCompleted() 方法也是无参无返回值的,因此 Action0 可以被当成一个包装对象,将 onCompleted() 的内容打包起来将自己作为一个参数传入 subscribe() 以实现不完整定义的回调。
Ation1:它同样只有一个方法 call(T param),这个方法也无返回值,但有一个参数;与 Action0 同理,由于 onNext(T obj) 和 onError(Throwable error) 也是单参数无返回值的,因此 Action1 可以将 onNext(obj)和 onError(error) 打包起来传入 subscribe() 以实现不完整定义的回调。
Observable observable = Observable.just("Hello", "World");
//处理onNext()中的内容
Action1 onNextAction = new Action1() {
@Override
public void call(String s) {
Log.i(TAG, s);
}
};
//处理onError()中的内容
Action1 onErrorAction = new Action1() {
@Override
public void call(Throwable throwable) {
}
};
//处理onCompleted()中的内容
Action0 onCompletedAction = new Action0() {
@Override
public void call() {
Log.i(TAG, "Completed");
}
};
根据以上Action的参数类型就可以区别出,每个所处理的函数功能:
参数和返回值类型 | 处理事件类型 |
---|---|
有参无返回值 | 处理onNext事件 |
- | – |
有参类型为Throwable但无返回值 | 处理onError事件 |
- | – |
无参无返回值 | 处理onCompleted事件 |
Flowable.just(1, 2, 3, 4, 5)
.map(new Function() {
@Override
public String apply(@NonNull Integer integer) throws Exception {
return "xulei" + integer;
}
})
.subscribe(new Consumer() {
@Override
public void accept(String s) throws Exception {
Log.e("rx2_test", "funcChange:" + s);
}
});
Subscription改名为Disposable。由于RxJava2中已经存在了org.reactivestreams.subscription这个类,为了避免名字冲突将原先的rx.Subscription改名为io.reactivex.disposables.Disposable。
CompositeSubscription也改名为CompositeDisposable。
由之前的Disposable换成了这个Subscription,即:onSubscribe(Subscription s)。
注意:Disposable必须单次使用,用完就要销毁。
RxJava2中除了保留了RxJava1中doOnComplete(),doOnError(),doOnNext()等状态回调之外,还增加了doOnCancel,doOnDispose,unsubscribeOn这几个状态回调,以doOnCancel为例:
Flowable.range(1, 4)
.doOnCancel(new Action() {
@Override
public void run() throws Exception {
Log.e("rx2_test", "回调doOnCancel");
}
})
.take(2)
.subscribe(new Consumer() {
@Override
public void accept(Integer integer) throws Exception {
Log.e("rx2_test", "doOnCancel:" + integer);
}
});
输出结果:
rx2_test: doOnCancel:1
rx2_test: doOnCancel:2
rx2_test: 回调doOnCancel
由于.take(2)操作符只截取了前两个事件,之后的事件未被发送,就会回调doOnCancel中的run()方法。
线程调度这里改动也不大,主要有以下三点:
移除Schedulers.immediate。
移除Schedulers.test。
io.reactivex.Scheduler抽象类支持直接调度自定义线程任务。
主题而言,变化也不大。