Android RxJava取消旧请求
我是Rxjava的新手,在下面描述的场景中探索可能性并需要帮助。
第1步:滑动视图
第2步:进行API调用以获取数据
以上步骤重复了多次Views。
问题:
- API_CALL_1获取View_1结果
- 用户滑动View_2
- API_CALL_2获取View_2结果
- View_1结果将返回并与View_2结果一起填充到View_2中
我需要在API_CALL_2请求时取消API_CALL_1请求。 谢谢。
班级成员:
Subscription mSubscription;
您的API调用:
if(subscription != null && !subscription.isUnsubscribed()){ subscription.unsubscribe(); subscription = null; } subscription = doApiCall("some_id") .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<Object>() { @Override public void call(Object o) { } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { } });
所以,它的主要想法,你必须退订以前的电话:
if(subscription != null && !subscription.isUnsubscribed()){ subscription.unsubscribe(); subscription = null; }
开始新的通话之前
更好的方法是使用switchMap来取消先前的请求
您可以使用“switchMap”运算符提供“取消”逻辑。 例如,你想开始/停止加载(用Kotlin编写的代码)。
val loadingObservable = Observable.timer(10, TimeUnit.SECONDS) val load = PublishSubject.create<Boolean>() val resultObservable = load.switchMap { if(it) loadingObservable else Observable.never() }
说明:
- 'loadingObservable'是一个模拟长时间运行的计时器
- 'load'是用户启动或停止加载的命令。 如果你想开始加载 – 发送True else False
- 'switchMap'运算符被设计为处理先前的可观察的。 所以你发送它将开始加载。 如果你发送错误,它会处理(取消)以前的可观察的。