一、简介
Activity.runOnUIThread 和 view.post
是Android提供的更新UI的方法,内部也是使用handler来处理消息的传递的
二、使用
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000)
} catch (InterruptedException e) {
e.printStackTrace();
}
//-------使用runOnUiThread更新UI------
runOnUiThread(new Runnable() {
@Override
public void run() {
mTextView.setText("我是runOnUiThread更新的");
}
});
//-------使用view.post更新UI------
mTextView.post(new Runnable() {
@Override
public void run() {
mTextView.setText("我是view—post更新的");
}
});
}
}).start();
三、源码解析
runOnUiThread是通过调用Activity中的handler来处理消息
view.post使用过调用view中的handler来处理消息
这两种更新UI的方法都会将自带的Runnable对象赋值给Message msg对象中的msg.callback(是一个Runnable)对象。在消息处理的最后的处理。
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
判断msg.callback(即Runnable)是否为空,如果不为空就会调用handleCallback(msg)方法。handleCallback(msg)方法内部会调用msg.callback.run()方法,也就是runOnUiThread和post中的run方法。
注意:dispatchMessage中的mCallback是handler中的一个接口类Callback,与msg.callback(Runnable对象)不是一个东西