因此,我有一個非常基本的RxJava觀察器流的工作流,其中我要求改進的東西,成功的響應我吐司成功味精和錯誤我吐司錯誤味精。在RxJava2中沒有實現onError錯誤,即使它實現
我以下,參照的情況是錯誤的情況下我期望從API錯誤味精,我將其轉換成用戶可讀取單詞而顯示爲Toast
,如下圖所示,當我使用doOnNext
和doOnError
方法這種方式,與錯誤崩潰提及。
我已經添加了throwExceptionIfFailure
方法,它顯示了我如何轉換可讀的消息和控制檯指向錯誤的行。
registerNFCTag(body)
.map(result -> throwExceptionIfFailure(result))
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(result -> {
toggleLoaders(true);
appToast(getString(R.string.done_msg) + tagName);
})
.doOnError(throwable -> {
Toasty.error(this, throwable.getLocalizedMessage()).show();
toggleLoaders(true);
})
.subscribeOn(Schedulers.io())
.subscribe();
錯誤如果這還不夠,我也可以發佈stacktrace。
java.lang.IllegalStateException: Exception thrown on Scheduler.Worker thread. Add `onError` handling.
ThrowExceptionIfFailure方法。
public <T> T throwExceptionIfFailure(T res) {
Response result = (Response<?>) res;
if (!result.isSuccessful()) {
try {
String msg = result.errorBody().string();
Log.d(TAG, "throwExceptionIfFailure: "+msg);
if (result.code() == 401 || result.code() == 403) {
invalidateToken();
msg = context.getString(R.string.invalid_credential);
}
else if (result.code() == 502)
msg = context.getString(R.string.server_down);
else if (result.code() == 422)
msg = context.getString(R.string.invalid_domain);
else if (result.code() == 500)
msg = context.getString(R.string.internal_server_error_500_msg);
else if (result.code() == 451)
------><>>>>>> expected error msg works well with the case mentioned below with throwable in subscribe itself.
msg = context.getString(R.string.toast_tag_already_registered_error);
if (result.code() == 403)
throw new TokenException();
else
------>>>>>below line where console points error
throw Exceptions.propagate(new RuntimeException(msg));
} catch (Throwable e) {
throw Exceptions.propagate(e);
}
} else {
return res;
}
}
但同樣的事情我訂閱這種方式,它工作正常,我看到錯誤信息如預期的烤。
registerNFCTag(body)
.map(result ->throwExceptionIfFailure(result))
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(
result -> {
toggleLoaders(true);
appToast(getString(R.string.done_msg) + tagName);
}
, throwable -> {
Toasty.error(this, throwable.getLocalizedMessage()).show();
toggleLoaders(true);
});
在RxJava2世界仍然是新手,所以幫助我瞭解差異。先謝謝你。
錯誤處理需要在'subscribe()'中作爲第二個參數完成。如果它不存在,那麼你會得到一個錯誤未被處理的通知。 'doOnError()'實際上並不是一個錯誤處理程序,儘管它的名字有其含義。 –
好吧,所以在第一種情況下,我應該如何處理doOnError()中的錯誤? –
爲什麼你不喜歡你在問題結尾發佈的工作示例?你的問題具體是什麼? – azizbekian