2016-05-06 12 views
0

Ich möchte ProgressBar zeigen, während der beobachtbaren Durchführung:Wie zeigt man den Dialog beim Start des Abonnements an?

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

;

aber ich erhalte diesen Fehler:

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

on line mProgressBar.setVisibility(View.VISIBLE);

wie showProgressBar() von doOnSubscribe() laufen?

Antwort

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

sollte funktionieren. Die Nebeneffekt-Operatoren werden synchron auf jedem Thread ausgeführt, der sie aufruft, also arbeiten sie einfach rückwärts. Siehe this gist und this discussion.

Verwandte Themen