首先我会尝试解释我想要做什么,接下来你会看到我在做什么(代码)。 由于我是RxJava的新人,并且还在学习,可以随意给我你的意见。
所以,我从服务器调用网络API,当启动请求我调用loader(微调器)时,完成后我隐藏它,当我收到错误时也一样。 我希望我的所有请求都是通用的,所以我从参数中得到了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);
}
在我的基础活动中,我有一个显示对话框的方法
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
答案 0 :(得分:25)
您需要在observeOn(AndroidSchedulers.mainThread())
之前致电doOnRequest
。 observeOn
适用于一系列电话后跟随他的所有运营商。在你的情况下引发异常是因为你试图在主线程之外创建一个对话框。