2016-09-05 5 views
7

まず最初に、何をしようとしているのか説明しようとします。 RxJavaで新しくなったので、まだ学習が自由になり、あなたの意見を聞くことができました。RxJava onError Looper.prepare()を呼び出していないスレッド内でハンドラを作成できません

私はサーバーからネットワークAPIを呼び出しています。リクエストを開始するときにローダー(スピナー)を呼び出すと、終了したらエラーが表示されます。 私はこの一般的なすべての私の要求のためにObservableとオブザーバをパラメータから取得します。このメソッドでは、私はちょうど非表示とローダーを表示する気になります。

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

スタックトレースを含める必要があります。そうしないと、例外がどこから発生したかは誰にもわかりません。 – Kiskae

答えて

10

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

+0

さて、それは動作します..ありがとう.. しかし、私は簡単な説明を与えることができますので、私は繰り返さないでしょうか? – user1851366

+0

ここには素晴らしい記事がありますhttp://tomstechnicalblog.blogspot.fi/2016/02/rxjava-understanding-observeon-and.html –

関連する問題