3.RxJava2.x與RxJava1.x的差異對比
歡迎大家加入QQ群一起討論: 489873144(android格調小窩)
RxJava2的使用步驟差異
第一步:初始化一個Observable
(RxJava)
(RxJava2)
第二步:初始化一個Observer
(RxJava)
(RxJava2)
第三部:建立訂閱關係
(RxJava)
(RxJava2)
區別:
Observer中多了一個回撥方法onSubscribe,傳遞引數為Disposable ,Disposable這個單詞的字面意思是一次性用品,用完即可丟棄的.相當於RxJava1.x中的Subscription,用於解除訂閱。 那麼在RxJava2.x中怎麼去理解它呢, 可以把觀察者和被觀察者理解為兩根水管, Disposable就是兩根管道之間的一個機關, 當呼叫它的dispose()方法時, 它就會將兩根管道切斷, 從而導致下游收不到事件.
注意: 呼叫dispose()並不會導致上游不再繼續傳送事件, 上游會繼續傳送剩餘的事件.
你可能納悶為什麼不像RxJava1.x中訂閱時返回Disposable,而是選擇回調出來呢。官方說是為了設計成Reactive-Streams架構。不過仔細想想這麼一個場景還是很有用的,假設Observer需要在接收到異常資料項時解除訂閱,在RxJava2.x中則非常簡便,只需要將回調中的Disposable物件儲存成成員變數,onError中取消即可。RxJava的訂閱方法的過載形式如下:
RxJava2的訂閱方法過載形式如下:
不帶任何引數的subscribe() 表示下游不關心任何事件,你上游儘管發你的資料去吧, 老子可不管你發什麼.
帶有一個Consumer引數的方法表示下游只關心onNext事件, 其他的事件我假裝沒看見,
其他幾個方法同理, 這裡就不一一解釋了.
相比以前RxJava來看,使用新的Consumer介面替代以前的Action1介面做不完整回撥,命名更加親切
RxJava2中沒有了一系列的ActionX/FunX介面,大多參照了Java8,取代介面如下:
Consumer即消費者,用於接收單個值
BiConsumer則是接收兩個值
Function用於變換物件
Predicate用於判斷。
其中Action類似於RxJava1.x中的Action0,區別在於Action允許丟擲異常。
背壓差異
在RxJava1.x中,處理背壓是在Observable中完成的,有如下幾種策略。
在RxJava2.x中,使用了一個全新的類Flowable來專門處理背壓,以前的Observable則已經沒有背壓的處理能力了,Flowable具有以下五種處理背壓的方式:
可以在建立的時候直接指定背壓策略:
也可以像RxJava1.x中一樣,在鏈中使用操作符控制如下:
其中還需要注意的一點在於,下游Subscriber中的的onSubscribe方法中傳給我們的不再是Disposable了, 而是Subscription, 它倆有什麼區別呢, 首先它們都是上下游中間的一個開關, 之前我們說呼叫Disposable.dispose()方法可以切斷水管, 同樣的呼叫Subscription.cancel()也可以切斷水管, 不同的地方在於Subscription增加了一個void request(long n)方法,並且Flowable並不是訂閱就開始傳送資料,而是需等到執行Subscription.request()才能開始傳送資料。當然,使用簡化subscribe訂閱方法會預設指定Long.MAX_VALUE。手動指定的例子如下:
其他差異
RxJava2中的SingleObserver比RxJava1.x多了一個回撥方法onSubscribe。
RxJava2中的CompletableObserver比RxJava1.x多了一個回撥方法onSubscribe。
Processor與Subject
看看他們的繼承結構如下,可以看出來Subject是RxJava1.x中就有的,繼承自Observable,所以不支援背壓,Processor是RxJava2.x中新加入的,所以支援背壓,此外,在用法上,並沒有太多差距。