当前位置: 首页 > 知识库问答 >
问题:

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

卢光誉
2023-03-14

我们正在建立一个应用程序使用改型与服务器通信,如果有一个网络错误,一个对话框(等效地,一个吐司)应该显示和请求将重做后,用户点击对话框。问题是我们希望全局处理它,而不是在每个请求周围编写重复的代码。使用A.Bertucci在本问题中描述的onerrorreveseenext()和observable view事件看起来很完美,但不幸的是,它运行在reverfit.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();
    });
}

共有1个答案

白高超
2023-03-14

不能在可观察到的界面中显示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());
}

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

 类似资料:
  • 我在我的项目中使用Retrofit2与可观察的接口和结果包装器。示例: 我需要Result wrapper从响应中获得比序列化对象更多的信息(例如headers、http Status...)。 问题是,对于结果包装器,网络调用不会引发异常。您可以通过调用result.error()在结果中找到异常。 如果我想利用RxJava错误操作符,我应该怎么做?例如,我希望对网络错误使用重试操作符,但重试操

  • 我正在制作一个使用语音识别的应用程序。它与Android KitKat 4.4.4(API 19)完美配合。但是当我在Nouget 7.0(API 24)或Lollipop语音识别对话框上尝试时,会显示网络未连接。 我有internet连接,并且在清单中添加了权限。可能是什么问题? 这是我的清单: 根据要求,我的主要活动:

  • 问题内容: 我一直在尝试使用Python创建一个简单的程序,该程序使用OpenCV从我的网络摄像头获取视频供稿并将其显示在屏幕上。 我知道我之所以在这里,是因为创建了窗口,并且网络摄像头上的灯闪烁了,但是它似乎在窗口中什么都没有显示。希望有人可以解释我在做什么错。 在不相关的注释上,我注意到我的网络摄像头有时会在中更改其索引号,有时我需要输入0、1或2,即使我只连接了一个摄像头,也没有拔下插头(我

  • 本文向大家介绍rx-java 设置Retrofit和RxJava,包括了rx-java 设置Retrofit和RxJava的使用技巧和注意事项,需要的朋友参考一下 示例 Retrofit2带有对多种可插入执行机制的支持,其中一种是RxJava。 要与RxJava一起使用改造,首先需要将Retrofit RxJava适配器添加到您的项目中: 那么在构建改造实例时需要添加适配器: 在您定义API的界面

  • 本文向大家介绍如何使用JavaScript显示提示对话框?,包括了如何使用JavaScript显示提示对话框?的使用技巧和注意事项,需要的朋友参考一下 当您要弹出文本框以获取用户输入时,提示对话框非常有用。因此,它使您可以与用户进行交互。用户需要填写该字段,然后单击“确定”。 使用称为的方法显示此对话框,该方法带有两个参数:(i)您要在文本框中显示的标签,以及(ii)要在文本框中显示的默认字符串。

  • 我正在为我的React应用程序使用材料UI的对话框组件。如何将组件设置为变量,以便调用方法?