什么是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         @Override
10         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                 @Override
17                 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             @Override
29             public void run() {
30                 Runnable r = new Runnable() {                    
31                     @Override
32                     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 message
10      *         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()方法也是的

 

posted @ 2014-09-10 13:00  Mirrorhanman  阅读(408)  评论(0编辑  收藏  举报