Android RxJava取消旧请求

时间:2016-11-14 05:43:38

标签: android rx-java rx-android

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

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

对于视图的数量重复上述步骤。

问题:

  
      
  1. API_CALL_1获取View_1结果
  2.   
  3. 用户滑动View_2
  4.   
  5. API_CALL_2获取View_2结果
  6.   
  7. View_1结果将返回并在View_2中与View_2结果一起填充
  8.   

我需要在API_CALL_2请求时取消API_CALL_1请求。 感谢。

3 个答案:

答案 0 :(得分: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;
}

开始新的通话之前

答案 1 :(得分:0)

更好的方法是使用switchMap取消先前的请求

答案 2 :(得分:0)

您可以使用'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'是用户启动或停止加载的命令。如果你想 开始加载 - 发送其他错误
  3. 'switchMap'运算符是 旨在处置以前的可观察物。所以你发送它会发送它 开始加载。如果您发送False,它将处置(取消)之前 观察到。