RxJava onError 无法在未调用 Looper.prepare() 的线程内创建处理程序
RxJava onError Can't create handler inside thread that has not called Looper.prepare()
首先我会尝试解释我想做什么,接下来你会看到我在做什么(代码)。
由于我是 RxJava 的新手,而且还在学习,所以请随意给我你的意见。
所以,我从服务器调用网络 API,当开始请求时我调用加载器(微调器),完成后我隐藏它,当我收到错误时也是如此。
我希望我的所有请求都具有这种通用性,因此我可以从参数中获取 Observable 和 Observer。在这个方法上,我只关心隐藏和显示加载器。
OnError(这里是技巧部分),我也试图显示一个对话框,但我得到了你可以在标题上看到的错误。
无法在尚未调用 Looper.prepare()
的线程内创建处理程序
这是代码..
protected void makeMyrequest(MyBaseActivity myBaseActivity, Observable observable, Observer observer) {
mSubscription = observable
.doOnRequest(new Action1<Long>() {
@Override
public void call(Long aLong) {
Log.d(TAG, "On request");
myBaseActivity.showLoader();
}
})
.doOnCompleted(new Action0() {
@Override
public void call() {
Log.d(TAG, "onCompleted: Hide spinner");
myBaseActivity.hideLoader();
mSubscription.unsubscribe();
}
})
.doOnError(new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Log.d(TAG, "onError: Hide spinner");
myBaseActivity.showAlertDialog("error");
myBaseActivity.hideLoader();
}
})
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
在我的基地activity我有一个显示对话框的方法
public void showAlertDialog(String message) {
mDialog = new AlertDialog.Builder(this)
.setMessage(message)
.show();
}
来自 stacktracer 的重要部分
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:200)
at android.os.Handler.<init>(Handler.java:114)
at android.app.Dialog.<init>(Dialog.java:119)
at android.app.Dialog.<init>(Dialog.java:168)
at android.support.v7.app.AppCompatDialog.<init>(AppCompatDialog.java:43)
at android.support.v7.app.AlertDialog.<init>(AlertDialog.java:95)
at android.support.v7.app.AlertDialog$Builder.create(AlertDialog.java:927)
at android.support.v7.app.AlertDialog$Builder.show(AlertDialog.java:952)
at xx.myapp.MyBaseActivity.showAlertDialog
您需要在 doOnRequest
之前致电 observeOn(AndroidSchedulers.mainThread())
。 observeOn
适用于调用链中他之后的所有操作员。在您的情况下引发了异常,因为您正试图在主线程之外创建一个对话框。
首先我会尝试解释我想做什么,接下来你会看到我在做什么(代码)。 由于我是 RxJava 的新手,而且还在学习,所以请随意给我你的意见。
所以,我从服务器调用网络 API,当开始请求时我调用加载器(微调器),完成后我隐藏它,当我收到错误时也是如此。 我希望我的所有请求都具有这种通用性,因此我可以从参数中获取 Observable 和 Observer。在这个方法上,我只关心隐藏和显示加载器。
OnError(这里是技巧部分),我也试图显示一个对话框,但我得到了你可以在标题上看到的错误。 无法在尚未调用 Looper.prepare()
的线程内创建处理程序这是代码..
protected void makeMyrequest(MyBaseActivity myBaseActivity, Observable observable, Observer observer) {
mSubscription = observable
.doOnRequest(new Action1<Long>() {
@Override
public void call(Long aLong) {
Log.d(TAG, "On request");
myBaseActivity.showLoader();
}
})
.doOnCompleted(new Action0() {
@Override
public void call() {
Log.d(TAG, "onCompleted: Hide spinner");
myBaseActivity.hideLoader();
mSubscription.unsubscribe();
}
})
.doOnError(new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Log.d(TAG, "onError: Hide spinner");
myBaseActivity.showAlertDialog("error");
myBaseActivity.hideLoader();
}
})
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
在我的基地activity我有一个显示对话框的方法
public void showAlertDialog(String message) {
mDialog = new AlertDialog.Builder(this)
.setMessage(message)
.show();
}
来自 stacktracer 的重要部分
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:200)
at android.os.Handler.<init>(Handler.java:114)
at android.app.Dialog.<init>(Dialog.java:119)
at android.app.Dialog.<init>(Dialog.java:168)
at android.support.v7.app.AppCompatDialog.<init>(AppCompatDialog.java:43)
at android.support.v7.app.AlertDialog.<init>(AlertDialog.java:95)
at android.support.v7.app.AlertDialog$Builder.create(AlertDialog.java:927)
at android.support.v7.app.AlertDialog$Builder.show(AlertDialog.java:952)
at xx.myapp.MyBaseActivity.showAlertDialog
您需要在 doOnRequest
之前致电 observeOn(AndroidSchedulers.mainThread())
。 observeOn
适用于调用链中他之后的所有操作员。在您的情况下引发了异常,因为您正试图在主线程之外创建一个对话框。