首页 > 代码库 > 什么是Handler(四)
什么是Handler(四)
1.Handler的post(Runnable)方法
2.Runnable的运行机制
3.post方法和sendMessage方法的区别
1.Handler的post(Runnable)方法
1 public static class PlaceholderFragment extends Fragment { 2 3 private Button button; 4 private Handler handler = new Handler(); //没有像以前那样写MyHandler方法 5 6 public PlaceholderFragment() { 7 } 8 9 @Override10 public View onCreateView(LayoutInflater inflater, ViewGroup container,11 Bundle savedInstanceState) {12 View rootView = inflater.inflate(R.layout.fragment_main, container, false);13 14 button = (Button)rootView.findViewById(R.id.buttonId);15 button.setOnClickListener(new OnClickListener() { 16 @Override17 public void onClick(View v) {18 TestThread tt = new TestThread();19 tt.start();20 }21 });22 23 return rootView;24 }25 26 class TestThread extends Thread{27 28 @Override29 public void run() {30 Runnable r = new Runnable() { 31 @Override32 public void run() {33 Log.i("tag","CuurentThread--->" + Thread.currentThread().getName()); 34 }35 };36 handler.post(r);37 } 38 }39 }
打印结果很劲爆
意味着Runnable竟然运行在主线程中!!!
看源码, Handler的post方法
1 public final boolean post(Runnable r)2 {3 return sendMessageDelayed(getPostMessage(r), 0);4 }
先看getPostMessage(r)
1 private static Message getPostMessage(Runnable r) {2 //该方法完成两个操作:1、生成了一个Message对象。2、将r赋值给Message的callback属性3 Message m = Message.obtain();4 m.callback = r; //Message的callback属性5 return m;6 }
因此Handler的post方法相当于下面
1 public final boolean post(Runnable r)2 {3 //return sendMessageAtTime(getPostMessage(r), 0);4 Meesage msg = getPostMessage(r);5 return sendMessageDelayed(msg, 0);6 }
上述中sendMessageDelayed是干嘛的呢
1 * Enqueue a message into the message queue after all pending messages 2 * before (current time + delayMillis). You will receive it in 3 * {@link #handleMessage}, in the thread attached to this handler. 4 * 5 * @return Returns true if the message was successfully placed in to the 6 * message queue. Returns false on failure, usually because the 7 * looper processing the message queue is exiting. Note that a 8 * result of true does not mean the message will be processed -- if 9 * the looper is quit before the delivery time of the message10 * occurs then the message will be dropped.11 */12 public final boolean sendMessageDelayed(Message msg, long delayMillis)13 {14 if (delayMillis < 0) {15 delayMillis = 0;16 }17 return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);18 }
也就是延迟发送, 当delayMillis=0即相当于直接发送
综上:生成一个Message对象, 将r赋值给Message对象的callback属性, 然后再将Message对象放置在消息队列当中
Looper取出了携带有r对象的Message对象之后, 调用dispatchMessage方法, 判断Message的callback属性是否有值, 此时callback属性有值,
所以执行了handCallback(Message msg),在该方法中执行msg.callback.run();
TestThread中从网络取回数据, 定义一个Runnable对象, 在其run()方法中直接写更新UI的代码,
再用主线程中生成的handler进行post出去, post方法中生成Message对象, r赋值给Meesage的callback属性,
Message放入消息队列之中, Looper取出, 调用dispatchMessage方法,
在dispatchMessage中调用handlercallback方法, 在handlercallback中会执行Runnable的run()方法。
因为Looper在主线程, 所以dispatchMessage啊, handlercallback啊, 也都会在主线程.同样run()方法也是的
什么是Handler(四)