Rxjava takeWhile、takeUtil 的區別


1.takeUtil

很顯然,observable.takUtil(condition),當condition == true時終止,且包含臨界條件的item

 

2.takeWhile

observable.takUtil(condition),當condition == false的時候終止,不包含臨界條件的item

3.使用場景

不停地獲取數據,直到[滿足/不滿足]某個條件時終止

買電影票付完款,會有一個出票的狀態:

status: 1: 出票中,2:出票失敗,3:出票成功

現在需要:在出票中時,5s輪詢一次出票狀態,直到成功或失敗。

4.使用takeUtil實現

// activity

...
private void autoFetchStatusInfo() {
    autoSubscription = Observable.interval(0, 5, TimeUnit.SECONDS)
            .flatMap(aLong -> orderService.getStatusInfo(orderId))      // 獲取訂單狀態
            .takeUntil(statusInfo -> statusInfo.isSuccess() || statusInfo.isFailed())
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(this::updateStatusView, Throwable::printStackTrace);
}

// 根據不同status展示不同view
private void updateStatusView(StatusInfo statusInfo) {
    ...
}

private void unsubscribeAutoFetch() {
    if (autoSubscription != null && !autoSubscription.isUnsubscribed()) {
        autoSubscription.unsubscribe();
    }
}

@Override
protected void onDestroy() {
    unsubscribeAutoFetch();
    super.onDestroy();
}

 

5.使用takeWhile實現

// activity

...
private void autoFetchStatusInfo() {
    autoSubscription = Observable.interval(0, 5, TimeUnit.SECONDS)
            .flatMap(aLong -> orderService.getStatusInfo(orderId))      // 獲取訂單狀態
            .takeWhile(statusInfo -> statusInfo.isGenerating())
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(this::updateStatusView, Throwable::printStackTrace);
}
...

問題出現了:由於takeWhile不包含condition == false時的item,所以這種實現只能展示出票中的狀態。

所以在該場景這種實現是錯誤的!

參考

http://reactivex.io/documentation/operators/takeuntil.html

http://reactivex.io/documentation/operators/takewhile.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM