我用subscripiton创建了Observable:
private Subscription mSearchSubscription = null;
mSearchSubscription = Observable.fromCallable(() -> {
many network requests
}).subscribe(doing sth);
当我的活动被销毁时,我正在执行以下行:
if (mSearchSubscription != null){
mSearchSubscription.unsubscribe();
}
根据在互联网上找到的信息,此行应取消此块中的所有代码执行。但它没有:(这个块里面的所有网络请求都包含Observables with subscribe所以当一个请求完成后,下一个请求正在执行等等。正如我注意到在取消订阅后执行并且活动被破坏了Observable中的代码仍然是执行。
有没有更好的办法阻止它?我在这个项目中使用RxJava1
更新: 我有MVC架构与控制器注入活动。通过从活动覆盖onDestroy我在控制器中调用方法来取消订阅。这是完整的代码。块fromCallable(( - ) - >)内的每个网络请求都像这样的mWebService.getSth(body参数).subscribe(doSth)(在接口中返回Observable)。我不希望在执行内部observable期间停止,但是停止执行这段代码,就像返回一样。由于需要逐个执行许多请求并且在所有内容都准备就绪时将结果返回到活动,因此这是包装的。
答案 0 :(得分: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 */);