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

20

首先,我将尝试解释我正在尝试做什么,然后您将看到我的代码。 由于我是RxJava的新手,并且仍在学习中,请随时给我您的意见。

所以,我从服务器调用网络API,当开始请求时,我调用加载程序(旋转器),当完成时,我隐藏它,当出现错误时也是如此。 我希望这对我所有的请求都是通用的,因此我从参数中获取Observable和Observer。在此方法中,我只关心隐藏和显示加载程序。

在发生错误时(这是一个棘手的问题),我还尝试显示对话框,但我得到了标题上可以看到的错误。 无法在未调用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

你需要包含堆栈跟踪,否则没有人能告诉你异常的起源。 - Kiskae
1个回答

45

在调用doOnRequest之前,您需要调用observeOn(AndroidSchedulers.mainThread())observeOn会作用于调用链中它之后的所有操作符。在您的情况下,出现异常是因为您试图在主线程以外创建对话框。


好的,它能工作...谢谢。 但是你能给我一个简要的解释吗,这样我就不会重复了吗? - user1851366
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Geralt_Encore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接