首页 > 解决方案 > 为什么当我在另一个线程 (RxIoScheduler-4) 中修改 UI 时它可以正常工作?

问题描述

presenter.login(user)
                 .flatMap(new Func1<Boolean, Observable<?>>() {
                     @Override
                     public Observable<?> call(Boolean result) {
                         if(result){
                             Log.i(TAG, " login thread "+Thread.currentThread().getName());
                             hideLoading();
                             presenter.saveLoginState(getIntent(),user,type);
                             finish();
                             return CampusFactory.getRetrofitService()
                                     .cache(new A(Integer.parseInt(user.sid),user.password));
                                     // TODO: 18-10-13 添加一个错误处理
                                     //.onErrorResumeNext();

                         }
                         return Observable.error(new Throwable());
                     }
                 }).subscribeOn(Schedulers.io())
                         .observeOn(AndroidSchedulers.mainThread())
                 .subscribe(msg->{
                     Log.i(TAG, " cache thread "+Thread.currentThread().getName());
                     Logger.i(((Msg)msg).getMsg());
                 },Throwable::printStackTrace);

Flatmap的第一次登录是“I/LOGIN: login thread RxIoScheduler-4”,下一次登录subscribe是“I/LOGIN: cache thread main”,所以Flatmap的线程如果是RxIoScheduler-4,我修改UI在这个线程,但它没有错并且运行良好。这很奇怪,hideLoading()方法如下。为什么我可以在其他线程中操作 UI?

public void hideLoading() {
    if (mLoadingDialog != null) {
        mLoadingDialog.dismissAllowingStateLoss();
    }
}

标签: androidmultithreadingrx-java

解决方案


推荐阅读