除了发送消息以外,咱们还有如下几种方法能够在子线程中进行UI操做:java
public boolean post(Runnable action) { Handler handler; if (mAttachInfo != null) { handler = mAttachInfo.mHandler; } else { ViewRoot.getRunQueue().post(action); return true; } return handler.post(action); } public final boolean post(Runnable r) { return sendMessageDelayed(getPostMessage(r), 0); }
原来这里仍是调用了sendMessageDelayed()方法去发送一条消息啊,而且还使用了getPostMessage()方法将Runnable对象转换成了一条消息,咱们来看下这个方法的源码:ide
private final Message getPostMessage(Runnable r) { Message m = Message.obtain(); m.callback = r; return m; }
在这个方法中将消息的callback字段的值指定为传入的Runnable对象。咦?这个callback字段看起来有些眼熟啊,喔!在Handler的dispatchMessage()方法中原来有作一个检查,若是Message的callback等于null才会去调用handleMessage()方法,不然就调用handleCallback()方法。那咱们快来看下handleCallback()方法中的代码吧:post
private final void handleCallback(Message message) { message.callback.run(); }
很简单,就是直接调用了一开始传入的Runnable对象的run()方法。spa
所以在子线程中经过Handler的post()方法进行UI操做就能够这么写:线程
public class MainActivity extends Activity { private Handler handler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); handler = new Handler(); new Thread(new Runnable() { @Override public void run() { handler.post(new Runnable() { @Override public void run() { // 在这里进行UI操做 } }); } }).start(); } }
虽然写法上相差不少,可是原理是彻底同样的,咱们在Runnable对象的run()方法里更新UI,效果彻底等同于在handleMessage()方法中更新UI。code
public boolean post(Runnable action) { Handler handler; if (mAttachInfo != null) { handler = mAttachInfo.mHandler; } else { ViewRoot.getRunQueue().post(action); return true; } return handler.post(action); }
若是当前的线程不等于UI线程(主线程),就去调用Handler的post()方法,不然就直接调用Runnable对象的run()方法。对象
public final void runOnUiThread(Runnable action) { if (Thread.currentThread() != mUiThread) { mHandler.post(action); } else { action.run(); } }