web-dev-qa-db-ja.com

RxJava onError 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);
}

私の基本アクティビティには、ダイアログを表示するメソッドがあります

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
14
user1851366

doOnRequestの前にobserveOn(AndroidSchedulers.mainThread())を呼び出す必要があります。 observeOnは、一連の呼び出しで彼の後のすべてのオペレーターに適用されます。メインスレッドの外部でダイアログを作成しようとしているために発生した例外。

28
Geralt_Encore