如何使用合并取消请求
How to cancel request using merge
实际上我在我的项目中使用了 RxAndroid、Retrofit2.0 和 Okhttp 3.2.0。
我正在使用 Observable.merge 来调用多个请求以上传文件。
是否有取消唯一请求的解决方案?我知道我可以使用 subscription.unsubscribe() 但它会取消所有任务。
我使用了像 client.dispatcher.get(0).cancel() 这样的 okhttp 方法,但它抛出一个像 Canceled 这样的 Io 异常,它会取消所有任务。
您是否有适当的方法来仅取消选定的请求?谢谢
您可以将 takeUntil(Observable a)
附加到每个构成 Observable 并使用 "control" observable 选择性地取消它们。例如
PublishSubject<Object> control1 = PublishSubject.create();
PublishSubject<Object> control2 = PublishSubject.create();
Observable<T> cancellableRestrofitObservable1 = retrofitObservable1.takeUntil(control1.asObservable());
Observable<T> cancellableRestrofitObservable2 = retrofitObservable2.takeUntil(control2.asObservable());
Observable<T> mergedObservable = Observable.merge(cancellableRestrofitObservable1,cancellableRestrofitObservable2);
// To cancel retrofitObservable1
control1.onNext("cancel");
它运作良好。这是代码:
PublishSubject control = PublishSubject.create();
publishSubjectMap.put(position, control);
Observable<Response<Upload>> cancellableRestrofitObservable = dropboxapi.uploadImage(requestBody, params, position)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.takeUntil(control.asObservable());
observables.add(cancellableRestrofitObservable);
Observable<Response<Upload>> mergedObservable = Observable.merge(observables);
//取消
publishSubjectMap.get(event.getPosition()).onNext("cancel");
实际上我在我的项目中使用了 RxAndroid、Retrofit2.0 和 Okhttp 3.2.0。 我正在使用 Observable.merge 来调用多个请求以上传文件。 是否有取消唯一请求的解决方案?我知道我可以使用 subscription.unsubscribe() 但它会取消所有任务。
我使用了像 client.dispatcher.get(0).cancel() 这样的 okhttp 方法,但它抛出一个像 Canceled 这样的 Io 异常,它会取消所有任务。
您是否有适当的方法来仅取消选定的请求?谢谢
您可以将 takeUntil(Observable a)
附加到每个构成 Observable 并使用 "control" observable 选择性地取消它们。例如
PublishSubject<Object> control1 = PublishSubject.create();
PublishSubject<Object> control2 = PublishSubject.create();
Observable<T> cancellableRestrofitObservable1 = retrofitObservable1.takeUntil(control1.asObservable());
Observable<T> cancellableRestrofitObservable2 = retrofitObservable2.takeUntil(control2.asObservable());
Observable<T> mergedObservable = Observable.merge(cancellableRestrofitObservable1,cancellableRestrofitObservable2);
// To cancel retrofitObservable1
control1.onNext("cancel");
它运作良好。这是代码:
PublishSubject control = PublishSubject.create();
publishSubjectMap.put(position, control);
Observable<Response<Upload>> cancellableRestrofitObservable = dropboxapi.uploadImage(requestBody, params, position)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.takeUntil(control.asObservable());
observables.add(cancellableRestrofitObservable);
Observable<Response<Upload>> mergedObservable = Observable.merge(observables);
//取消 publishSubjectMap.get(event.getPosition()).onNext("cancel");