如何在订阅开始时显示对话框?

How to show dialog on start of subscribe?

我想在执行 Observable 时显示 ProgressBar:

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

如何从 doOnSubscribe() 运行 showProgressBar()?

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

应该可以。副作用运算符在调用它的任何线程上同步执行,因此只需向后工作。参见 this gist and this discussion