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()方法很重要哦!