Handler的post()方法解析

一、先从源码看起:

mHandler.post(new Runnable(){

           @Override

            public void run(){

                       //TODO

              }

});

其中run方法中写更新UI的代码,其实只是把这个Runnable当成一条消息来处理,下面看源码:


public final boolean post(Runnable r)

{

            return sendMessageDelayed(getPostMessage(r),0);

}


private static Message getPostMessage(Runnable r) {

                   Message m = Message.obtain();

                  m.callback = r;

                  return m;

}

可以看到,在getPostMessage中,得到了一个Message对象,然后将我们创建的Runable对象作为callback属性,赋值给了此message.

注:产生一个Message对象,可以new  ,也可以使用Message.obtain()方法;两者都可以,但是更建议使用obtain方法,因为Message内部维护了一个Message池用于Message的复用,避免使用new 重新分配内存。


public final boolean sendMessageDelayed(Message msg,long delayMillis)

{

               if(delayMillis <0) {

                          delayMillis =0;

                }

               return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);

}


public boolean sendMessageAtTime(Message msg,long uptimeMillis) {

                MessageQueue queue = mQueue;

                if(queue ==null) {

                          RuntimeException e =new RuntimeException(

                                          this+" sendMessageAtTime() called with no mQueue");

                           Log.w("Looper", e.getMessage(), e);

                           return false;

                }

                return enqueueMessage(queue, msg, uptimeMillis);

}

最终和handler.sendMessage一样,调用了sendMessageAtTime,然后调用了enqueueMessage方法,给msg.target赋值为handler,最终加入MessagQueue.

可以看到,这里msg的callback和target都有值,那么会执行哪个呢?

其实上面已经贴过代码,就是dispatchMessage方法:

public void dispatchMessage(Message msg) {

            if(msg.callback !=null) {

                     handleCallback(msg);

            }else{

                        if(mCallback !=null) {

                                  if(mCallback.handleMessage(msg)) {

                                                return;

                                  }

                        }

                        handleMessage(msg);

         }

}

第2行,如果不为null,则执行callback回调,也就是我们的Runnable对象。

你可能感兴趣的:(Handler的post()方法解析)