[英]Cancel execuction of Observable (RxJava 1)
我用subscripiton創建了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)。 我不希望在內部可觀察的執行過程中停止運行,而是停止執行此代碼塊,就像返回一樣。 之所以進行打包,是因為許多請求需要一個接一個地執行,並在一切准備就緒后將結果返回給活動。
您尚未詳細說明如何以及為什么這樣做,因此我最好的猜測是使用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 */);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.