2016-09-05 4 views
7

Сначала я попытаюсь объяснить, что я пытаюсь сделать, а затем вы увидите, что я делаю (код). С тех пор, как я новый в RxJava, и все еще учился, я дал вам свое мнение.RxJava onError Невозможно создать обработчик внутри потока, который не вызвал Looper.prepare()

Таким образом, im вызывает сетевой API с сервера, а при запуске запроса я вызываю загрузчик (spinner), когда заканчиваю, я скрываю его и тот же, когда получаю сообщение об ошибке. Я бы хотел, чтобы этот родовой для всех моих запросов, поэтому я получаю Observable и Observer из параметра. По этому методу я просто забочусь о спрятателе и загрузчике.

OnError (и вот трюк), im пытается показать диалог тоже, но я получил ошибку, которую вы можете увидеть по названию. Невозможно создать обработчик внутри потока, который не под названием 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

Вам необходимо позвонить по телефону observeOn(AndroidSchedulers.mainThread()) до doOnRequest. observeOn применяется ко всем операторам после него по цепочке вызовов. В вашем случае исключение возникает из-за того, что вы пытаетесь создать диалог вне основного потока.

+0

Ну, это работает .. Спасибо .. Но можете ли вы дать мне краткое объяснение, так что я не буду повторять? – user1851366

+0

Вот хорошая статья об этом http://tomstechnicalblog.blogspot.fi/2016/02/rxjava-understanding-observeon-and.html –

Смежные вопросы

 Смежные вопросы