Android RxJava取消旧请求

我是Rxjava的新手,在下面描述的场景中探索可能性并需要帮助。

第1步:滑动视图
第2步:进行API调用以获取数据

以上步骤重复了多次Views。

问题:

  1. API_CALL_1获取View_1结果
  2. 用户滑动View_2
  3. API_CALL_2获取View_2结果
  4. 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() } 

说明:

  1. 'loadingObservable'是一个模拟长时间运行的计时器
  2. 'load'是用户启动或停止加载的命令。 如果你想开始加载 – 发送True else False
  3. 'switchMap'运算符被设计为处理先前的可观察的。 所以你发送它将开始加载。 如果你发送错误,它会处理(取消)以前的可观察的。