Android RxJava2的更新

xiaoxiao2021-02-28  126

前言: 在了解RxJava2.0的更新前,首先了解一个概念“背压”backpressure。 从字面意思理解就是:你在完成一件事的时候,后面一直在增加事情。在事情增加到你完成不了的时候就会崩溃。 在RxJava中,如果被观察者一直发送事件,观察者的事件处理速度跟不上事件发送速度,事件就会一直累积,直到内存奔溃。 网上有网友对背压(Backpressure)做一个明确的定义:背压是指在异步场景中,被观察者发送事件速度远快于观察者的处理速度的情况下,一种告诉上游的被观察者降低发送速度的策略 具体的实现方式是响应式拉取 reactive pull:即观察者主动从被观察者那里去拉取数据,而被观察者变成被动的等待通知再发送数据。

参考:

https://zhuanlan.zhihu.com/p/24473022?refer=dreawer http://www.jianshu.com/p/220955eefc1f

关于RxJava2.0更新:

1 . 观察者模式

首先声明,RxJava以观察者模式为骨架,在2.0中依然如此。

不过此次更新中,出现了两种观察者模式:

Observable(被观察者)/Observer(观察者) Flowable(被观察者)/Subscriber(观察者)

RxJava2.X中,Observeable用于订阅Observer,是不支持背压的,而Flowable用于订阅Subscriber,是支持背压(Backpressure)的。

Observable正常用法:

Observable mObservable=Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { e.onNext(1); e.onNext(2); e.onComplete(); } }); Observer mObserver=new Observer<Integer>() { //这是新加入的方法,在订阅后发送数据之前, //回首先调用这个方法,而Disposable可用于取消订阅 @Override public void onSubscribe(Disposable d) { } @Override public void onNext(Integer value) { } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }; mObservable.subscribe(mObserver);

Flowable/Subscriber

Flowable.range(0,10) .subscribe(new Subscriber<Integer>() { Subscription sub; //当订阅后,会首先调用这个方法,其实就相当于onStart(), //传入的Subscription s参数可以用于请求数据或者取消订阅 @Override public void onSubscribe(Subscription s) { Log.w("TAG","onsubscribe start"); sub=s; //在代码中,传递事件开始前的onstart()中,调用了request(1),通知被观察者先发送一个事件,然后在onNext()中处理完事件,再次调用request(1),通知被观察者发送下一个事件.... sub.request(1); Log.w("TAG","onsubscribe end"); } @Override public void onNext(Integer o) { Log.w("TAG","onNext--->"+o); sub.request(1); } @Override public void onError(Throwable t) { t.printStackTrace(); } @Override public void onComplete() { Log.w("TAG","onComplete"); } });

2 .操作符相关

Action相关

之前我在文章里介绍过关于Action这类接口,在1.0中,这类接口是从Action0,Action1…往后排(数字代表可接受的参数),现在做出了改动

Rx1.0———–Rx2.0

Action1——–Action Action1——–Consumer Action2——–BiConsumer 后面的Action都去掉了,只保留了ActionN

Function相关 同上,也是命名方式的改变

3 . 线程调度

可以说这一块儿基本也没有改动,如果一定要说的话。

那就是去掉了Schedulers.immediate()这个线程环境 移除的还有Schedulers.test()(我好像从来没用过这个方法) io.reactivex.Scheduler这个抽象类支持直接调度自定义线程任务(这个我也没怎么用)

补充2

在RxJava1.0中,有的人会使用CompositeSubscription来收集Subscription,来统一取消订阅,现在在RxJava2.0中,由于subscribe()方法现在返回void,那怎么办呢?

其实在RxJava2.0中,Flowable提供了subscribeWith这个方法可以返回当前订阅的观察者,并且通过ResourceSubscriber DisposableSubscriber等观察者来提供 Disposable的接口。

所以,如果想要达成RxJava1.0的效果,现在应该是这样做:

CompositeDisposable composite = new CompositeDisposable();

composite.add(Flowable.range(1, 8).subscribeWith(subscriber));

这个subscriber 应该是 ResourceSubscriber 或者 DisposableSubscriber 的实例

转载请注明原文地址: https://www.6miu.com/read-33163.html

最新回复(0)