Почему, когда я изменяю пользовательский интерфейс в другом потоке (RxIoScheduler-4), он работает нормально? - PullRequest
0 голосов
/ 13 октября 2018
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: поток входа в RxIoScheduler-4», а следующий журнал в подписке - «I / LOGIN: основной поток кэша», поэтому поток Flatmap, если RxIoScheduler-4и я изменяю пользовательский интерфейс в этой теме, но он не ошибается и работает хорошо.Это очень странно, и метод hideLoading() выглядит следующим образом.Почему я могу управлять пользовательским интерфейсом в другом потоке?

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