快速切换到主线程更新UI的几种方法

  1. Activity.runOnUiThread(Runnable)
  • 如果当前线程是UI线程,那么会立即执行
  • 反之,会调用UI线程handler.post()将其放入UI线程的消息队列中
new Thread(){
       public void run() {
           //此时在子线程
           ((MainActivity) context).runOnUiThread(new Runnable() {
              @Override
              public void run() {
                 //此时已经回到主线程,注意要强转到主线程的MainActivity
              }
          });
       };
}.start();
  1. View.post(Runnable)
  • 如果View已经attach到Window,直接调用UI线程的Handler发送Runnable到MessageQueue
  • 如果View还未attach到Window,将Runnable放入ViewRootImplRunQueue中,RunQueue会实现延迟执行Runnable任务,并且Runnable最终不会被加入到MessageQueue里,也不会被Looper执行,而是等到ViewRootImpl的下一个performTraversals时候,把RunQueue里的所有Runnable都拿出来并执行,接着清空RunQueue
mTextView.post(new Runnable() {
    @Override
    //可快速更新该view
    public void run() {
        mTextView.setText("xxx");
        //也可以更新其他view
       mIageView.setBackgroundResource(R.drawable.icon);
    }
});

3.Handler.post(Runnable)

//假设在子线程,需要获取主线程的Looper和Queue
new Handler(Looper.getMainLooper()).post(new Runnable() {
        @Override
        public void run() {
            //此时已经回到主线程
        }
    });

你可能感兴趣的:(快速切换到主线程更新UI的几种方法)