RxJava onError无法在未调用Looper.prepare()的线程内创建处理程序

时间:2016-09-05 16:18:01

标签: android rx-java rx-android

首先我会尝试解释我想要做什么,接下来你会看到我在做什么(代码)。 由于我是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

1 个答案:

答案 0 :(得分:25)

您需要在observeOn(AndroidSchedulers.mainThread())之前致电doOnRequestobserveOn适用于一系列电话后跟随他的所有运营商。在你的情况下引发异常是因为你试图在主线程之外创建一个对话框。