【发布时间】: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 请更新问题,而不是在评论部分写代码。