2016-05-06 3 views
0

Я хочу показать ProgressBar в процессе выполнения Observable:Как показать диалог начала подписки?

Observable<T> observable; 
Observer<T> observer; 
................... 
observable.doOnSubscribe(()->{showProgressBar();} 
      .finallyDo(()-> {hideProgressBar();}) 
      .subscribeOn(Schedulers.newThread()) 
      .observeOn(AndroidSchedulers.mainThread()) 
.subscribe(observer); 

................... 
    protected void showProgressBar() { 
     if (mProgressBar != null) 
      mProgressBar.setVisibility(View.VISIBLE); 
    } 
    protected void hideProgressBar() { 
     if (mProgressBar != null) 
      mProgressBar.setVisibility(View.GONE); 
    } 

;

, но я получаю эту ошибку:

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 

на линии mProgressBar.setVisibility(View.VISIBLE);

как запустить showProgressBar() из doOnSubscribe()?

ответ

3
observable.subscribeOn(Schedulers.newThread()) 
      .doOnSubscribe(()->{showProgressBar();} 
      .subscribeOn(AndroidSchedulers.mainThread()) 
      .finallyDo(()-> {hideProgressBar();})   
      .observeOn(AndroidSchedulers.mainThread()) 

должно работать. Операторы побочных эффектов выполняют синхронно по любому потоку, который он так просто работает в обратном направлении. См. this gist и this discussion.

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