1. 程式人生 > >RxJava在項目中的特殊使用場景

RxJava在項目中的特殊使用場景

使用 let 操作 emit www 是否 edi xpl except

本文基於:RaJava 2.1.14,另外本文不會對操作符的使用進行介紹,詳情請參考RxJava 2.x Operators

參考:

  • rxjavas-repeatwhen-and-retrywhen-explained
  • 【譯】對RxJava中.repeatWhen()和.retryWhen()操作符的思考

輪播

根據需要改變本次延遲訂閱時間

repeat將會在每次請求回調Observer.onComplete()或者Subscriber.onComplete()之前就會重新訂閱事件,而repeatWhen可以根據自己的需求確定是否需要再次進行循環、延遲訂閱、改變延遲訂閱時間等。這就比較符合在我項目中的需求:第一次請求完成之後需要延遲一分鐘再訂閱,如果未打斷請求的話將會改變這個訂閱時間為兩分鐘。本來采用repeatWhen

+ delay能夠實現固定的輪播的效果,但卻不能動態的改變輪播的間隔,於是改為repeatWhen + flatMap + timer來實現:

Observable.just(2)
                .repeatWhen(objectObservable -> objectObservable
                        .flatMap((Function<Object, ObservableSource<?>>) o -> Observable.timer(getRepeatInterval(), TimeUnit.SECONDS
))) .subscribeWith(new DebugResourceObserver<>());

getRepeatInterval()可以動態的返回你設置的時間

打斷輪播

使用上述方式可以動態改變每次重訂閱的時間,現在我們還需要加入條件來打斷輪播。使用filter操作符就可以實現輪播的打斷操作。

Observable.just(2)
                .repeatWhen(objectObservable -> objectObservable
                        .filter(o -> abort
()) .flatMap((Function<Object, ObservableSource<?>>) o -> Observable.timer(getRepeatInterval(), TimeUnit.SECONDS))) .subscribeWith(new DebugResourceObserver<>());

intervalRange

intervalRange操作符來實現,定義如下:

Signals a range of long values, the first after some initial delay and the rest periodically after.
<p>
The sequence completes immediately after the last value (start + count - 1) has been reached.
<p>
@param start that start value of the range
@param count the number of values to emit in total, if zero, the operator emits an onComplete after the initial delay
@param initialDelay the initial delay before signalling the first value (the start)
@param period the period between subsequent values
@param unit the unit of measure of the initialDelay and period amounts
@return the new Observable instance

具體使用:

Observable.just(2)
                .repeatWhen(new Function<Observable<Object>, ObservableSource<?>>() {
                    @Override
                    public ObservableSource<?> apply(Observable<Object> objectObservable) throws Exception {
                        return objectObservable
                                .filter(o -> abort())
                                .flatMap((Function<Object, ObservableSource<?>>) o -> Observable.intervalRange(0, getCount(), 0, getRepeatInterval(), TimeUnit.SECONDS));
                    }
                });

暫時涉及到自己的一些“需求”就這些!希望對大家有幫助!

RxJava在項目中的特殊使用場景