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