我正在使用以下代码段(在RxJava2中)从网络中检索URL列表,并使用每个URL来下载文件。
imageService.download()
将以最大并发值为3运行。
disposable.add(imageRepository.getUrls()
.flatMap(url -> imageService.download(url)
.subscribeOn(schedulerProvider.io()), MAX_CONCURRENT_DOWNLOADS)
.flatMap(response -> fileManagerService.saveFile(response))
.subscribeOn(schedulerProvider.io())
.observeOn(schedulerProvider.ui())
.subscribe(file -> {}, throwable -> {}, () -> {}));
一切正常,在99%的时间内都可以。但是在某些特定条件下,我得到了UndeliverableException
:特别是当网络连接不再可用时,将调用disposable.clear()
(这由JobScheduler
组件自动处理)。
所以实际上发生的是,我正在尝试处置一次性对象,同时imageService.download()
观察对象将尝试调用onError
(HTTP错误)。
似乎处置操作并未“停止”内部flatMap
中的订阅。
W/System.err: io.reactivex.exceptions.UndeliverableException: com.apollographql.apollo.exception.ApolloNetworkException: Failed to execute http call
at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:367)
09-19 11:37:59.501 23732-23732/app.dev W/System.err: at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.dispose(ObservableFlatMap.java:314)
at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.disposeAll(ObservableFlatMap.java:514)
at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.dispose(ObservableFlatMap.java:311)
at io.reactivex.internal.disposables.DisposableHelper.dispose(DisposableHelper.java:125)
at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeOnObserver.dispose(ObservableSubscribeOn.java:73)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.dispose(ObservableObserveOn.java:146)
at io.reactivex.internal.disposables.DisposableHelper.dispose(DisposableHelper.java:125)
at io.reactivex.internal.observers.LambdaObserver.dispose(LambdaObserver.java:102)
at io.reactivex.disposables.CompositeDisposable.dispose(CompositeDisposable.java:235)
at io.reactivex.disposables.CompositeDisposable.clear(CompositeDisposable.java:201)
我应该在全局级别处理错误吗? ((RxJavaPlugins.setErrorHandler
)还是有更好的方法来防止它发生?