Android RxJava 取消旧请求

Android RxJava Cancel the old request

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

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

查看次数重复上述步骤。

问题:

  1. API_CALL_1 fetching the View_1 Results
  2. User swipes a View_2
  3. API_CALL_2 fetching the View_2 Results
  4. View_1 results are returned and populated in View_2 along with View_2 results

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

Class 会员:

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' 运算符提供 'cancel' 逻辑。例如,你想 start/stop loading (Code written in 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' 运算符是 旨在处理以前的可观察对象。所以你发送 True 它会 开始加载。如果你发送 False 它将处理(取消)之前的 可观察到。