【问题标题】:Android RxJava Cancel the old requestAndroid RxJava 取消旧请求
【发布时间】:2017-09-27 17:42:33
【问题描述】:

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

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

针对 View 的数量重复上述步骤。

问题:

  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 请求。 谢谢。

【问题讨论】:

标签: android rx-java rx-android


【解决方案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;
}

开始新通话之前

【讨论】:

  • 谢谢亚历山大。我按照你的建议取消了订阅。我在刷卡时仍然收到旧数据。
  • subscription.isUnsubscribed() 在订阅时始终为真!= null
  • @VinayKG,请发布您的代码。没有代码我很难帮助你。谢谢!
【解决方案2】:

您可以使用“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' 运算符是 旨在处理以前的 observable。所以你发送 True 它会 开始加载。如果您发送 False 它会处理(取消)之前的 可观察到。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 2013-05-22
      相关资源
      最近更新 更多