Handlerメッセージ処理メカニズムシリーズの「01.Handlerメッセージ送信」を必ず理解する

4099 ワード

Handlerメッセージ処理メカニズムシリーズの「Handlerメッセージ送信」を必ず理解する
Handlerメッセージの送信方法は2つあります.
  • Post
    public final boolean post(Runnable r){
           return  sendMessageDelayed(getPostMessage(r), 0);
      }
    /**
    @param delayMillis                     
    */
    public final boolean postDelayed(Runnable r, long delayMillis){
            return sendMessageDelayed(getPostMessage(r), delayMillis);
      }
    /**
            Message            ,          ,               ,                 
    */
    public final boolean postAtFrontOfQueue(Runnable r){
            return sendMessageAtFrontOfQueue(getPostMessage(r));
      }
    /**
    @param uptimeMillis            uptimeMillis         
    */
    public final boolean postAtTime(Runnable r, long uptimeMillis){
            return sendMessageAtTime(getPostMessage(r), uptimeMillis);
      }
    public final boolean postAtTime(Runnable r, Object token, long uptimeMillis){
            return sendMessageAtTime(getPostMessage(r, token), uptimeMillis);
      }
    
    各Postメソッドには共通のパラメータがあり、これはRunnableインタフェースが受信され、このパラメータはコールバックのために使用されることを示す.Postを使用してメッセージを送信するたびにsendMessageの関連メソッドが呼び出され、各sendMessageの関連メソッドにはMessageオブジェクトが必要になるので、Runnableオブジェクトを持ってgetPostMessageメソッドを呼び出し、
    private static Message getPostMessage(Runnable r) {
            Message m = Message.obtain();
            m.callback = r;
            return m;
        };
    private static Message getPostMessage(Runnable r, Object token) {
            Message m = Message.obtain();
            m.obj = token;
            m.callback = r;
            return m;
        };
    
    getPostMessageはMessageオブジェクトを返し、Messageオブジェクトを持って関連sendMessageメソッドを呼び出します.
  • Send
    public final boolean sendMessage(Message msg){
            return sendMessageDelayed(msg, 0);
        };
    public final boolean sendEmptyMessage(int what){
            return sendEmptyMessageDelayed(what, 0);
        };
    /**
    @param uptimeMillis            uptimeMillis        
    */
    public final boolean sendEmptyMessageAtTime(int what, long uptimeMillis) {
            Message msg = Message.obtain();
            msg.what = what;
            return sendMessageAtTime(msg, uptimeMillis);
        };
    /**
    @param delayMillis                    
    */
    public final boolean sendEmptyMessageDelayed(int what, long delayMillis) {
            Message msg = Message.obtain();
            msg.what = what;
            return sendMessageDelayed(msg, delayMillis);
        };
    public final boolean sendMessageDelayed(Message msg, long delayMillis){
            if (delayMillis < 0) {
                delayMillis = 0;
            }
            return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
        };
    public final boolean sendMessageAtFrontOfQueue(Message msg) {
            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, 0);
        };
     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);
        };
    
    は、sendMessageAtFrontOfQueueメソッドを除いて、他のメソッドが最終的にsendMessageAtTimeメソッドを呼び出すMessageオブジェクトを生成し、sendMessageAtTimeで現在のメッセージキューを取得し、enqueueMessageメソッドが新しく生成したMessageオブジェクトをキューに入れることを見ることができる.
    private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
            msg.target = this;
            if (mAsynchronous) {
                msg.setAsynchronous(true);
            }
            return queue.enqueueMessage(msg, uptimeMillis);
        }
    

  • シリーズディレクトリ:
    Handlerメッセージ処理メカニズムシリーズの「01.Handlerメッセージ送信」を必ず理解する
    Handlerメッセージ処理メカニズムシリーズの「02.Message入列」を必ず理解する
    Handlerメッセージ処理メカニズムシリーズの「03.MessageQueueとLooperの由来」を必ず理解する
    Handlerメッセージ処理メカニズムシリーズの「04.Messageがどのようにトリガーされたのか」を理解するに違いない.