gpt4 book ai didi

android - Retrofit2 + RxJava 错误处理

转载 作者:太空宇宙 更新时间:2023-11-03 12:04:28 26 4
gpt4 key购买 nike

我正在使用 RxJava 和 Retrofit2(使用 OkHttp 作为 HTTP 客户端)进行网络连接,并试图了解 Retrofit2 如何处理不同的错误以及它们从 RxJava 端看起来如何。以下代码说明了网络调用的 RxJava 订阅者回调(使用 Retrofit 进行)。

        Subscription subscription = observable
.subscribeOn(mScheduler)
.observeOn(mAndroidScheduler)
.subscribe(new Subscriber<User>() {
@Override
public void onCompleted() {
Timber.d("onCompleted called");
mRetainerView.clearUserObservable();
mActivityView.hideProgressBar();
mActivityView.enableUi();
}

@Override
public void onError(Throwable e) {
Timber.d("onError called");
Timber.d(e.toString());
mRetainerView.clearUserObservable();
mActivityView.hideProgressBar();
mActivityView.enableUi();
}

@Override
public void onNext(User user) {
Timber.d("onNext called");
mRetainerView.clearUserObservable();
mActivityView.hideProgressBar();
mActivityView.enableUi();
mActivityView.launchMainActivity();
}
});

我的问题是,在什么情况下会调用 onError(),一旦调用,我如何询问 Throwable 以确定原因?

从 Retrofit 源代码看来,唯一可以看到的 Throwable 是 IOException 和 HttpException。谁能证实这是真的?

最佳答案

基础知识:onError() 将在以下情况下调用:

  • 您订阅的 observable 抛出异常(例如,您在尝试读取文件时收到 IOException)
  • 在您的 onNext() 方法中引发异常。

如果在您的onComplete() 中出现异常,RxJava 将传播一个rx.exceptions.OnCompletedFailedException,如果在onError() - 你会得到 rx.exceptions.OnErrorFailedException

就是说,您可以只探测在 onError() 方法中接收到的 Throwable 是否有您期望的异常。例如,您知道如果您的 API 调用导致客户端错误 (4xx),Retrofit 会将其包装到 HttpException 中。如果请求超时,您将收到 SocketTimeoutException。这是一个粗略的例子:

@Override
public void onError(Throwable e) {
Timber.d("onError called");
Timber.d(e.toString());
handleError(e);
}

private handleError(Throwable throwable) {
if (throwable instanceof HttpException) {
HttpException httpException = (HttpException)throwable;
int statusCode = httpException.code();
// handle different HTTP error codes here (4xx)
} else if (throwable instanceof SocketTimeoutException) {
// handle timeout from Retrofit
} else if (throwable instanceof IOException) {
// file was not found, do something
} else {
// generic error handling
mRetainerView.clearUserObservable();
mActivityView.hideProgressBar();
mActivityView.enableUi();
}

关于android - Retrofit2 + RxJava 错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39454787/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com