1. Handler的post()方法
- 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();
- }
- }
2. View的post()方法
- public boolean post(Runnable action) {
- Handler handler;
- if (mAttachInfo != null) {
- handler = mAttachInfo.mHandler;
- } else {
- ViewRoot.getRunQueue().post(action);
- return true;
- }
- return handler.post(action);
- }
3. Activity的runOnUiThread()方法原理
- public final void runOnUiThread(Runnable action) {
- if (Thread.currentThread() != mUiThread) {
- mHandler.post(action);
- } else {
- action.run();
- }
- }
原理都是通过handler的post方法实现的
所有的post和sendMessage方法最后都会调用handler.sendMessage()方法进行入队操作,消息队列按照时间排序,之后使用Looper.loop方法出队,
每当有一个消息出队,就将它传递到msg.target的dispatchMessage()方法中,msg.target其实就是Handler,handleMessage方法:
- public void dispatchMessage(Message msg) {
- if (msg.callback != null) {
- handleCallback(msg);
- } else {
- if (mCallback != null) {
- if (mCallback.handleMessage(msg)) {
- return;
- }
- }
- handleMessage(msg);
- }
- }
将消息对象作为参数传入handleMessage方法中