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