1. Handler
public class SecondActivity extends Activity {
private static final int MSG_WHAT = 101;
TextView tv;
Button btn;
private MyHadler mHandler1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
tv = (TextView) findViewById(R.id.tv);
btn = (Button) findViewById(R.id.btn);
mHandler1 = new MyHadler();
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
updateUi();
}
});
}
class MyHadler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case MSG_WHAT:
String str = (String) msg.obj;
tv.setText(str);
}
}
};
/**
*
*/
private void updateUi1() {
new Thread() {
@Override
public void run() {
try {
Thread.sleep(5 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message message = mHandler1.obtainMessage();
message.what = MSG_WHAT;
message.obj = "来自子线程的数据";
mHandler1.sendMessage(message);
}
}.start();
}
}
2.Handler的post()方法
private void updateUi2() {
new Thread() {
@Override
public void run() {
try {
Thread.sleep(5 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mHandler1.post(new Runnable() {
@Override
public void run() {
tv.setText(" Handler.post更新UI");
}
});
}
}.start();
}
看看post()方法的源码
public final boolean post(Runnable r)
{
return sendMessageDelayed(getPostMessage(r), 0);
}
该方法调用了sendMessageDelayed(getPostMessage(r), 0)发送一条消息,下面首先看看 getPostMessage()方法
private static Message getPostMessage(Runnable r) {
Message m = Message.obtain();
m.callback = r;
return m;
}
getPostMessage()方法是将Runnable对象转化为消息对象Message的callback属性。而sendMessageDelayed()方法就不多说 了,又回到Handler的处理机制了。
Handler的dispatchMessage()方法
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
可以看到,首先判断如果message的callback不等于null,则调用Handler的handleCallback()方法,否则调用Handler对象的handleMessage()方法。
3. Activity的runOnUiThread()方法
/**
* 通过runOnUiThread更新UI
*/
private void updateUi3(){
new Thread(){
@Override
public void run() {
try {
Thread.sleep(3*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
runOnUiThread(new Runnable() {
@Override
public void run() {
tv.setText("runOnUiThread更新UI");
}
});
}
}.start();
}
看看runOnUiThread()方法的源码
public final void runOnUiThread(Runnable action) {
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
} else {
action.run();
}
}
4.View.post(Runnable r)方法
private void updateUi4(){
new Thread(){
@Override
public void run() {
super.run();
tv.post(new Runnable() {
@Override
public void run() {
tv.setText("view post更新UI");
}
});
}
}.start();
}
再来看看post()方法的源码
public boolean post(Runnable action) {
final AttachInfo attachInfo = mAttachInfo;
if (attachInfo != null) {
return attachInfo.mHandler.post(action);
}
// Postpone the runnable until we know on which thread it needs to run.
// Assume that the runnable will be successfully placed after attach.
getRunQueue().post(action);
return true;
}
该方法还是调用了Handler的post()方法。Handler的post()方法很重要哦!