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

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

;

但我收到此错误:

 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 gistthis discussion .

关于java - 如何在订阅开始时显示对话框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37070418/

相关文章:

java - Maven 无法执行目标 org.codehaus.mojo :exec-maven-plugin:1. 3

java - 对象关系映射和性能

java - Spring @ControllerAdvice 不起作用

java - 从 Java 运行 C++ 问题

Android firebase 9.0.0 setValue 序列化枚举

android - RecyclerView 下方的按钮

java - 为 Observable 提供值(value)

java - 序列化(或解析)Protobuf 对象

java - 在 rxAndroid 中返回对象的 ArrayList

android - 如何在使用 Rx 开始第二个请求之前等待第一个请求完成?