【发布时间】:2015-10-24 16:18:51
【问题描述】:
我们正在构建一个使用 Retrofit 与服务器通信的应用程序,如果出现网络错误,应显示一个对话框(相当于一个 toast),并在用户单击该对话框后重做请求。
问题在于我们希望全局处理它,而不是围绕每个请求编写重复的代码。使用onErrorResumeNext() 如a.bertucci 在this question 中描述的带有可观察视图事件 看起来很完美,但不幸的是它在Retrofit.Idle 线程中运行并且无法启动任何UI 元素。有可能解决吗?
一个失败的例子:
public static <T> Func1<Throwable, ? extends Observable<? extends T>> retryOnNetworkError(final Activity activity, final Observable<T> toBeResumed) {
return new Func1<Throwable, Observable<? extends T>>() {
@Override
public Observable<? extends T> call(Throwable throwable) {
if (throwable instanceof RetrofitError &&
RetrofitUtils.isNetworkError((RetrofitError) throwable)) {
return dialog(activity, R.string.dialog_title_network_error, R.string.dialog_msg_network_error)
.filter(ok -> ok)
.flatMap(ok -> toBeResumed);
}
return Observable.error(throwable);
}
};
}
public static Observable<Boolean> dialog(Context context, int title, int message) {
return Observable.create((Subscriber<? super Boolean> subscriber) -> {
final AlertDialog ad = new AlertDialog.Builder(context)
.setTitle(title)
.setMessage(message)
.setPositiveButton(android.R.string.ok, (dialog, which) -> {
subscriber.onNext(true);
subscriber.onCompleted();
})
.setNegativeButton(android.R.string.cancel, (dialog, which) -> {
subscriber.onNext(false);
subscriber.onCompleted();
})
.create();
// cleaning up
subscriber.add(Subscriptions.create(ad::dismiss));
ad.show();
});
}
【问题讨论】:
-
您能分享一下您在哪里调用
retryOnNetworkError方法吗?谢谢! -
对不起@Luccas,我找不到代码,因为几个月前我已经放弃了这种方式,相反,我在每个请求中都使用了一个常见的错误处理程序,例如 // Observable.subscribe(data- >{}, error-> CommonHandler.handle(context, error));
标签: android error-handling retrofit rx-android