UndeliverableException while calling onError of ObservableEmitter in RXjava2
retrofit2, rx-android, rx-java2
Solution
Since version 2.1.1 `tryOnError` is available:
The emitter API (such as FlowableEmitter, SingleEmitter, etc.) now features a new method, tryOnError that tries to emit the Throwable if the sequence is not cancelled/disposed. Unlike the regular onError, if the downstream is no longer willing to accept events, the method returns false and doesn't signal an UndeliverableException.
https://github.com/ReactiveX/RxJava/blob/2.x/CHANGES.md
Problem
I have a method which creates an emitter like below, there are a problem(maybe it is normal behavior) with calling onError in retrofit callback. I got UndeliverableException when try to call onError. I can solve this by checking subscriber.isDiposed() by I wonder how can call onError coz i need to notify my UI level. - Addition 1 ``` --> RxJava2CallAdapterFactoryalready implemented private static Retrofit.Builder builderSwift = new Retrofit.Builder() .baseUrl(URL_SWIFT) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .addConverterFactory(new ToStringConverterFactory()); --> When i added below code to application class app won't crash --> but i get java.lang.exception instead of my custom exception RxJavaPlugins.setErrorHandler(Functions<Throwable>emptyConsumer()); @Override public void onFileUploadError(Throwable e) { Log.d(TAG, "onFileUploadError: " + e.getMessage()); } ``` ``` public Observable<UploadResponseBean> upload(final UploadRequestBean uploadRequestBean, final File file) { return Observable.create(new ObservableOnSubscribe<UploadResponseBean>() { @Override public void subscribe(@NonNull final ObservableEmitter<UploadResponseBean> subscriber) throws Exception { // ---> There are no problem with subscriber while calling onError // ---> Retrofit2 service request ftsService.upload(token, uploadRequestBean, body).enqueue(new Callback<UploadResponseBean>() { @Override public void onResponse(Call<UploadResponseBean> call, Response<UploadResponseBean> response) { if (response.code() == 200){ // ---> calling onNext works properly subscriber.onNext(new UploadResponseBean(response.body().getUrl())); } else{ // ---> calling onError throws UndeliverableException subscriber.onError(new NetworkConnectionException(response.message())); } } @Override public void onFailure(Call call, Throwable t) { subscriber.onError(new NetworkConnectionException(t.getMessage())); } }); } }); } ```