Activity.runOnUiThread(Runnable)
- 如果当前线程是UI线程,那么会立即执行
- 反之,会调用UI线程
handler.post()
将其放入UI线程的消息队列中
new Thread(){
public void run() {
//此时在子线程
((MainActivity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
//此时已经回到主线程,注意要强转到主线程的MainActivity
}
});
};
}.start();
View.post(Runnable)
- 如果View已经attach到Window,直接调用UI线程的Handler发送Runnable到MessageQueue
- 如果View还未attach到Window,将Runnable放入
ViewRootImpl
的RunQueue
中,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() {
//此时已经回到主线程
}
});