gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:07:01 31 4
gpt4 key购买 nike

我们正在构建一个使用 Retrofit 与服务器通信的应用程序,如果出现网络错误,应显示一个对话框(相当于 toast),并在用户单击该对话框后重做请求。问题在于我们希望全局 处理它,而不是围绕每个请求编写重复的代码。使用 onErrorResumeNext(),如 a.bertucci 在 this question 中所述observable view event 看起来很完美,但不幸的是它在 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();
});
}

最佳答案

您不能在 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());
}

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

关于android - 使用 Retrofit 和 Rxjava 显示网络错误对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31772377/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com