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
