【问题标题】:Cancel execuction of Observable (RxJava 1)取消 Observable 的执行 (RxJava 1)
【发布时间】:2018-03-22 14:25:23
【问题描述】:

我已经创建了带有订阅的 Observable:

private Subscription mSearchSubscription = null;

mSearchSubscription = Observable.fromCallable(() -> {
    many network requests
}).subscribe(doing sth);

当我的活动被销毁时,我正在执行以下行:

 if (mSearchSubscription != null){
        mSearchSubscription.unsubscribe();
    }

根据在互联网上找到的信息,此行应取消此块中的所有代码执行。但它不是 :( 这个块内的所有网络请求都用订阅包装了 Observables,所以当一个请求完成时,下一个请求正在执行,依此类推。正如我注意到在执行取消订阅并且活动被破坏后 Observable 内的代码仍在执行。

有没有更好的方法来阻止它?我在这个项目中使用 RxJava1

更新: 我有 MVC 架构,控制器注入到 Activity 中。通过从活动中覆盖 onDestroy,我调用控制器中的方法来取消订阅。这是完整的代码。块 fromCallable(()-> ) 中的每个网络请求都类似于 mWebService.getSth(body parameters).subscribe(doSth) (在接口中返回 Observable )。我不希望在执行内部 observable 期间停止,而是停止执行这段代码,就像 return 一样。这是因为许多请求需要一一执行并在一切准备就绪时将结果返回给活动。

【问题讨论】:

  • 您在哪里取消订阅Observable?如果您在Activity 中创建它,那么您应该在onPause() 方法中取消订阅它。如果在其他地方使用它(例如在Service 中),那么您应该根据特定组件的生命周期以其他方法取消订阅它。 Observable 的实施也可能存在问题,但我们在您的帖子中看不到。它可能以错误的方式实现,并且可能存在内存泄漏,从而导致您遇到问题。
  • 请提供fromCallable 电话的内部信息。您还提到了其中的“带有订阅的包装的 Observables”,这绝对是错误的,因为它们与外部 subscribe 调用断开连接。
  • 我有 MVC 架构,控制器注入到 Activity 中。通过从活动中覆盖 onDestroy,我调用控制器中的方法来取消订阅。这是完整的代码。块 fromCallable(()-> ) 中的每个网络请求都类似于 mWebService.getSth(body parameters).subscribe(doSth) (在接口中返回 Observable )。我不希望在执行内部 observable 期间停止,而是停止执行这段代码,就像 return 一样。这是因为许多请求需要一一执行并在一切准备就绪时将结果返回给活动。
  • @masztalski 请更新问题,而不是在评论部分写代码。

标签: java android rx-java


【解决方案1】:

你没有详细说明你如何以及为什么这样做,所以我最好的猜测建议是使用create

Observable.create(emitter -> {
    CompositeSubscription resources = new CompositeSubscription();
    emitter.setSubscription(resources);

    if (resources.isUnsubscribed()) {
        return;
    }

    // add these if you want to cancel the inner sources
    // resources.add(

    mWebService.getFirst(/* params */).subscribe(/* postprocess */);

    // );

    if (resources.isUnsubscribed()) {
        return;
    }
    mWebService.getSecond(/* params */).subscribe(/* postprocess */);

    if (resources.isUnsubscribed()) {
        return;
    }

    mWebService.getThird(/* params */).subscribe(/* postprocess */);

    emitter.onNext(/* the result object*/
    emitter.onComplete();
}, Emitter.BackpressureMode.BUFFER)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(/* work with the data */);

【讨论】:

  • 好的,谢谢。在每次通话之前检查是否取消订阅的想法似乎是一个不错的解决方案。我明天试试
猜你喜欢
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多