【问题标题】:show dialog on network error using Retrofit and Rxjava使用 Retrofit 和 Rxjava 显示网络错误对话框
【发布时间】: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


【解决方案1】:

您不能在 Observable 中显示 UI 元素。您需要在 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());
}

使用此方法,您可以在线程中调用对话框。

【讨论】:

    猜你喜欢
    • 2016-06-29
    • 2017-05-13
    • 1970-01-01
    • 2017-10-03
    • 2017-04-18
    • 2014-10-02
    • 1970-01-01
    • 2021-12-28
    • 2021-05-11
    相关资源
    最近更新 更多