到来的Rxjava2.0<一>

博客转移到个人站点:http://www.wangchengmeng.club/2018/02/01/%E5%88%B0%E6%9D%A5%E7%9A%84Rxjava2.0/

欢迎来吐槽

背景

一开始的使用Rxjava1.0,感觉到了很多好处,于是就自己研究并运用到项目中去,结合当今最流行的Retrofit2.0和MVP一起封装一套写起来就跟模板一样的框架,项目地址,但,就在两个多月前,Rxjava更新到2.0了,而且两者的更改比较大,于是又去揣摩2.0,不敢说Rxjava2.0一定比1.0好,但新的东西很值得去学习和研究的。还没了解过的可以看看这篇文章

rxjava1.0的知识这里就先不做介绍了,看这里Rxjava1.0Retrofit2.0

Rxjava2.0的一些用法

//新增 FLowalble
 Flowable<String> flowable = new Flowable<String>() {
     @Override
     protected void subscribeActual(Subscriber<? super String> s) {
        SystemClock.sleep(1000);
        s.onNext("I am RX 2.0");
     }
  };

Subscriber<String> subscriber = new Subscriber<String>() {
     @Override
     public void onSubscribe(Subscription s) {
        s.request(Long.MAX_VALUE);//增加请求数量 订阅者自己申请处理多少请求
     }

     @Override
     public void onNext(String s) {
        mTvResult.setText(s);
     }

     @Override
     public void onError(Throwable t) {
        mTvResult.setText(t.toString());
     }

     @Override
     public void onComplete() {
     }
  };

  flowable.subscribeOn(Schedulers.io())
          .observeOn(AndroidSchedulers.mainThread())//线程切换没变
          .subscribe(subscriber);

上面就是一个 被订阅者产生事件,订阅者消费事件的流程,跟1.0没什么区别,可以Flowable还是第一次见到。

Flowable的出现是因为一直Backpressure(背压)的策略,Rxjava中会出现被订阅者迅速的产生事件,以至于订阅者没有及时的处理完这些事件,无限堆积最后在城OOM。而Flowable就是来处理这种情况的。
注意:背压策略主要是针对事件的处理者,而不针对事件的生产者。

1.ERROR

这种方式会在产生Backpressure问题的时候直接抛出一个异常,这个异常就是著名的MissingBackpressureException。

Flowable flowable = Flowable.create(new FlowableOnSubscribe() {
@Override
public void subscribe(FlowableEmitter emitter) throws Exception {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
emitter.onComplete();
}
}, BackpressureStrategy.ERROR); //增加了一个参数

Rxjava异步调用的缓存策略:

在异步调用时,RxJava中有个缓存池,用来缓存消费者处理不了暂时缓存下来的数据,缓存池的默认大小为128,即只能缓存128个事件。无论request()中传入的数字比128大或小,缓存池中在刚开始都会存入128个事件。当然如果本身并没有这么多事件需要发送,则不会存128个事件。在ERROR策略下,如果缓存池溢出,就会立刻抛出MissingBackpressureException异常。

2.BUFFER

所谓BUFFER就是把RxJava中默认的只能存128个事件的缓存池换成一个大的缓存池,支持存很多很多的数据。
这样,消费者通过request()即使传入一个很大的数字,生产者也会生产事件,并将处理不了的事件缓存。
但是这种方式任然比较消耗内存,除非是我们比较了解消费者的消费能力,能够把握具体情况,不会产生OOM。
总之BUFFER要慎用。

3.DROP
简单的说就是消费不了的事件,就直接丢弃。

4.LATEST
LATEST与DROP功能基本一致。唯一的区别就是LATEST总能使消费者能够接收到生产者产生的最后一个事件。

上述例子Flowable对象的获取都是通过create()获取的,自然可以通过BackpressureStrategy.LATEST之类的方式指定处理背压的策略。如果Flowable对象不是自己创建的,可以采用onBackpressureBuffer()、onBackpressureDrop()、onBackpressureLatest()的方式指定。

 Flowable.just(1).onBackpressureBuffer()
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe(new Consumer<Integer>() {
                @Override
                public void accept(Integer integer) throws Exception {

                }
            });

以上大概描述了Rxjava2.0新增的Flowable,为什么会新增这个被订阅者,其实用法都跟Observable一样,主要就是这个背压策略。下一篇文章介绍一下2.0对一些API的更改,以及区别

猜你喜欢

转载自blog.csdn.net/xiaohuanqi/article/details/73469783
今日推荐