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

android – 使用Retrofit和Rxjava显示网络错误对话框,第1张

概述我们正在使用Retrofit构建一个与服务器通信的应用程序,如果出现网络错误,则应显示一个对话框(相当于一个toast),并在用户单击对话框后重新执行该请求. 问题在于我们希望全局处理它,而不是围绕每个请求编写重复的代码.使用onErrorResumeNext()如a.bertucci在 this question中所描述的那样,可观察的视图事件看起来很完美但不幸的是它在Retrofit.Idle 我们正在使用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,which) -> {                    subscriber.onNext(false);                    subscriber.onCompleted();                })                .create();        // cleaning up        subscriber.add(Subscriptions.create(ad::dismiss));        ad.show();    });}
解决方法 您无法在Oservable中显示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 booleanmActivity.runOnUiThread(new Runnable() {                        @OverrIDe                        public voID run() {                            MyAlertDialog(mActivity,"My Title : ","My Text");                        }                    });                observer.onCompleted();            } catch (Exception e) {                observer.onError(e);                e.printstacktrace();            }            return Subscriptions.empty();        }    }).subscribeOn(Schedulers.threadPoolForIO());}

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

总结

以上是内存溢出为你收集整理的android – 使用Retrofit和Rxjava显示网络错误对话框全部内容,希望文章能够帮你解决android – 使用Retrofit和Rxjava显示网络错误对话框所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1123555.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存