处置时出现UndeliverableException,并且onError同时发生

时间:2018-09-19 10:10:49

标签: android rx-java rx-java2

我正在使用以下代码段(在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)还是有更好的方法来防止它发生?

0 个答案:

没有答案