title: Why when I modify UI in another thread (RxIoScheduler-4) it does work fine?
body: <pre><code>presenter.login(user)
                   .flatMap(new Func1&lt;Boolean, Observable&lt;?&gt;&gt;() {
                       @Override
                       public Observable&lt;?&gt; 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-&gt;{
                       Log.i(TAG, " cache thread "+Thread.currentThread().getName());
                       Logger.i(((Msg)msg).getMsg());
                   },Throwable::printStackTrace);
  </code></pre>
  
  <p>The first log in Flatmap is "I/LOGIN:  login thread RxIoScheduler-4", and the next log in subscribe is " I/LOGIN:  cache thread main",so the thread of Flatmap if RxIoScheduler-4, and I modify UI in this thread but it have no wrong and work well. That is very strange and the <code>hideLoading()</code> method is as following. Why can I operate UI in other thread? </p>
  
  <pre><code>public void hideLoading() {
      if (mLoadingDialog != null) {
          mLoadingDialog.dismissAllowingStateLoss();
      }
  }
  </code></pre>