使用Retrofit和Rxjava显示网络错误对话框

问题描述 投票:4回答:1

我们正在使用Retrofit构建一个与服务器通信的应用程序,如果出现网络错误,则应显示一个对话框(相当于一个toast),并在用户单击对话框后重新执行该请求。问题在于我们希望全局处理它,而不是围绕每个请求编写重复的代码。使用onErrorResumeNext()this question中描述的Retrofit.Idle与可观察的视图事件看起来很完美但不幸的是它在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(); }); } 线程中运行并且无法启动任何UI元素。有可能解决这个问题吗?

一个失败的例子:

Activity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            AlertDialog(Activity, "Information : ", R.drawable.box_info, "Empty !").show;
                        }
                    });  

 public Observable<Boolean> add(Objet myObj) {
    return Observable.create(new Observable.OnSubscribeFunc<Boolean>() {
        @Override
        public Subscription onSubscribe(Observer<? super Boolean> observer) {
            System.out.println("In Observable ! ");
            try {
                observer.onNext(MyObjet.callmethod()); //callMethod retunr a boolean
mActivity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            MyAlertDialog(mActivity, "My Title : ", R.drawable.box_info, "My Text");
                        }
                    });
                observer.onCompleted();
            } catch (Exception e) {
                observer.onError(e);
                e.printStackTrace();
            }
            return Subscriptions.empty();
        }
    }).subscribeOn(Schedulers.threadPoolForIO());
}
android error-handling retrofit rx-android
1个回答
0
投票

您无法在Observable中显示UI元素。你需要在UI线程上运行它。我有同样的错误,这是我的解决方案:

qazxswpoi

使用此方法,您可以在线程中调用Dialog。

© www.soinside.com 2019 - 2024. All rights reserved.