到來的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的更改,以及區別

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章