Observer.onError, стрельба непоследовательно

Я использую Retrofit для доступа к моему API следующим образом:

public interface UserService { ... @POST("/user/login") public Observable<User> register(@Body() User user); } 

Вот как я обращаюсь к своему API:

 mUserService.register(user) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<User>() { @Override public void onCompleted() { .... } @Override public void onError(Throwable e) { .... } @Override public void onNext(User user) { .... } }); 

Это работает отлично, за исключением случаев, когда есть исключение (например, IOException или время соединения), метод onError не запускается, вместо этого я получаю исключение в основном потоке, который завершает мое приложение.

Однако в некоторых случаях (например, когда вызов API отвечает с кодом состояния 400), метод onError запускается, как ожидалось.

После копания вывода logcat я заметил эту строку (не знаю, как я должен иметь дело с этим)

Rx.exceptions.OnErrorFailedException: Ошибка при попытке распространения ошибки на Observer.onError

Может ли кто-нибудь сообщить мне, где я делаю что-то неправильно?

В моем предыдущем опыте с RxJava исключение OnErrorFailedException означает, что исключение возникло при обработке другого исключения в методе onError .

Если вы не видите трассировку стека реальной причины, вероятно, это связано с ошибкой в ​​RxJava с CompositeException (версии 0.19.2 и выше) https://github.com/Netflix/RxJava/issues/1405

В качестве обходного решения попробуйте обернуть свой код onError в блок try-catch и onError в журнал исключение. Таким образом вы увидите, в чем проблема с вашей реализацией onError и вы сможете решить эту проблему.

 @Override public void onError(Throwable e) { try { ... catch(Throwable e) { // Log the exception } } 

Вы можете использовать небезопасную небезопасную подписку.

 ... .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .unsafeSubscribe(new Observer<User>() { @Override public void onCompleted() { .... } @Override public void onError(Throwable e) { .... } @Override public void onNext(User user) { .... } }); ... 
Intereting Posts
Ограничения хранилища веб-SQL в Chrome и Android? Gradle публикует для конкретного репо Artifactory Как правильно выпустить Android MediaPlayer Android Google Maps v2, MAP_TYPE_NONE и черные квадраты RequestFocus пропустить следующий EditText Textview меняет цвет фона без причины Android AutoCompleteTextView с автоматической фильтрацией пользовательских адаптеров Ожидание ожидаемого намерения не будет работать после того, как приложение будет приостановлено или убито Как использовать новый API доступа к карте Lollipop SD на устройствах, работающих под управлением KITKAT? Автономная маршрутизация в android В какое время в жизненном цикле приложения можно / следует использовать макетные измерения? Samsung Galaxy S2 AVD – официальный скин, как сделать правильные размеры Как сделать непрерывную анимацию TransitionDrawable в Android? Сценарии на планшете Android для простой текстовой аналитики и дискретного моделирования Проблемы с подключением Bluetooth