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

Nic*_*hek 0 java android rx-java rx-android

我想在执行 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);
    }
Run Code Online (Sandbox Code Playgroud)

;

但我收到此错误:

 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
Run Code Online (Sandbox Code Playgroud)

在线的 mProgressBar.setVisibility(View.VISIBLE);

如何运行showProgressBar()doOnSubscribe()

Joh*_*wUs 5

observable.subscribeOn(Schedulers.newThread())
          .doOnSubscribe(()->{showProgressBar();}
          .subscribeOn(AndroidSchedulers.mainThread())
          .finallyDo(()-> {hideProgressBar();})        
          .observeOn(AndroidSchedulers.mainThread())
Run Code Online (Sandbox Code Playgroud)

应该管用。副作用运算符在任何调用它的线程上同步执行,因此只需向后工作。请参阅此要点此讨论