android - Bitmap 下载期间出现 UndeliverableException : RxJava

标签 android rx-java rx-java2

我的 fragment 中有一个如下所示的可观察链。我有一个微调器,它会在项目选择时触发 Subject,并且根据选择,我正在使用 Picasso 在 Schedulers.computation() 中下载位图。

Disposable d =  mSpinnerSelectionSubject.switchMap(selectedItem -> Observable.fromCallable(this::getImageDetails))
          .observeOn(Schedulers.computation())
          .switchMap(imageDetails -> Observable.fromCallable(() -> mPicasso.load(imageDetails.getImagePath()).get()))
          .observeOn(AndroidSchedulers.mainThread())
          .switchMap(this::setBitmapInView)
          .observeOn(Schedulers.computation())
          .switchMap(this::generateBitmaps) // this method does some opencv bitmap operation
          .observeOn(AndroidSchedulers.mainThread())
          .subscribeWith(new DisposableObserver<ImageData>() {
              @Override
              public void onNext(ImageData imageData) {
                  // do something
              }

              @Override
              public void onError(Throwable e) {
                  // handle error
              }

              @Override
              public void onComplete() {
                  Timber.d("onComplete: ");
              }
          }));

mCompositeDisposable.add(d);

它工作正常,但有时我会收到 UndeliverableException 。我在下面给出了堆栈跟踪。

io.reactivex.exceptions.UndeliverableException: java.io.InterruptedIOException: thread interrupted
    at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:367)
    at io.reactivex.internal.operators.observable.ObservableFromCallable.subscribeActual(ObservableFromCallable.java:48)
    at io.reactivex.Observable.subscribe(Observable.java:11442)
    at io.reactivex.internal.operators.observable.ObservableSwitchMap$SwitchMapObserver.onNext(ObservableSwitchMap.java:126)
    at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:200)
    at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:252)
    at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
    at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
    at java.lang.Thread.run(Thread.java:761)
 Caused by: java.io.InterruptedIOException: thread interrupted
    at okio.Timeout.throwIfReached(Timeout.java:145)
    at okio.Okio$1.write(Okio.java:76)
    at okio.AsyncTimeout$1.write(AsyncTimeout.java:180)
    at okio.RealBufferedSink.flush(RealBufferedSink.java:224)
    at okhttp3.internal.http1.Http1Codec.finishRequest(Http1Codec.java:166)
    at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:84)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:45)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
    at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
    at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:126)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
    at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200)
    at okhttp3.RealCall.execute(RealCall.java:77)
    at com.squareup.picasso.OkHttp3Downloader.load(OkHttp3Downloader.java:91)
    at com.squareup.picasso.NetworkRequestHandler.load(NetworkRequestHandler.java:46)
    at com.squareup.picasso.BitmapHunter.hunt(BitmapHunter.java:219)
    at com.squareup.picasso.RequestCreator.get(RequestCreator.java:429)
    at com.my.app.modules.detailscreen.DetailFragment.lambda$null$7$DetailFragment(Fragment.java:117)

我尝试重现错误,我看到的是,如果我在下载位图时离开 fragment ,主要会发生这种情况。

我要添加到 CompositeDisposable 并在我正在调用的 fragment “onDestroyView”事件中的可观察对象

mCompositeDisposable.clear();                

我也在 onDestroy 事件中做

mCompositeDisposable.clear();                

我不知道究竟是什么导致了崩溃。希望有人能帮助我。提前致谢!!

最佳答案

异常的来源是Observable.fromCallable(() -> mPicasso.load(imageDetails.getImagePath()).get())。发生这种情况是因为运行它的调度程序在处理它时会发送一个 Thread.interrupt() 信号,并且 fromCallable 运算符将捕获异常并向其发出信号,而不管是否操作已被处置。

要解决此问题,您可以改用 Single.create,然后通过 SingleEmitter.tryOnError 方法手动捕获和处理异常。

关于android - Bitmap 下载期间出现 UndeliverableException : RxJava,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50152106/

相关文章:

android - 在模拟器 1.6 上运行单元测试时,Dalvikvm 崩溃并显示 "LinearAlloc exceeded capacity"

java - 传递和设置 boolean 值 - Java/Android

android - 创建发出监听器回调结果的 Kotlin 协程 Deferred 对象

java - RxJava。将列表的热可观察对象转换为单项流,对其进行处理并转换为列表

java - RxJava 2 Cancellable 和 Disposable 有什么区别?

android - RxJava 2. 在处理其他不同项目时延迟重试

android - 从微调器 onItemSelected 更改微调器选项

java - Observable#single() 和 Observable#toSingle() 之间的区别?

java - Observable.create() subscribeOn 和 observeOn 不工作

java - ImageView 上的 TextView ?