设为首页 加入收藏

TOP

Android Handler机制(四)---Handler源码解析(二)
2017-10-13 10:35:46 】 浏览:1227
Tags:Android Handler 机制 ---Handler 源码 解析
true,则直接返回,否则接着调用Handler自己的handleMessage方法,其默认实现是do nothing,如果你

是extends Handler,那么你应该在你的子类中为handleMessage提供自己的实现。

5.一系列obtainMessage

public final Message obtainMessage()
    {
        return Message.obtain(this);
    }
public final Message obtainMessage(int what)
    {
        return Message.obtain(this, what);
    }
public final Message obtainMessage(int what, int arg1, int arg2, Object obj)
    {
        return Message.obtain(this, what, arg1, arg2, obj);
    }

从上面可以看出来还是调用的Message的obtain方法,来构造message。

6.一系列postXXX方法:

 /**
     * Causes the Runnable r to be added to the message queue.
     * The runnable will be run on the thread to which this handler is 
     * attached. 
     *  
     * @param r The Runnable that will be executed.
     * 
     * @return Returns true if the Runnable was successfully placed in to the 
     *         message queue.  Returns false on failure, usually because the
     *         looper processing the message queue is exiting.
     */
 public final boolean post(Runnable r)
    {
       return  sendMessageDelayed(getPostMessage(r), 0);
    }
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);
    }
public final boolean postDelayed(Runnable r, long delayMillis)
    {
        return sendMessageDelayed(getPostMessage(r), delayMillis);
    }
 public final boolean postAtFrontOfQueue(Runnable r)
    {
        return sendMessageAtFrontOfQueue(getPostMessage(r));
    }

上面方法的作用就是:把Runnable发送到消息队列,执行的时候实行Runnable的run方法。。

下面看一系列sendXXX方法,和上边对应的。。。

//把消息入队
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);
    }
 public final boolean sendEmptyMessage(int what)
    {
        return sendEmptyMessageDelayed(what, 0);

  上面所有的postXXX,sendXXX方法最后都会调用这个方法:enqueueMessage

 private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
        msg.target = this;
        if (mAsynchronous) {
            msg.setAsynchronous(true);
        }
        return queue.enqueueMessage(msg, uptimeMillis);
    }

 最后调用queue的enqueueMessage方法把msg入队,对这个方法不了解的,可以看前边的MessageQueue源码解析。

SystemClock.uptimeMillis(),就是表示系统开机到当前的时间总数,如果有延迟,就加上延迟时间,分析到现在,我们也能发现,postDelayed不是延迟多少秒发送消息,这个消息是直接发送给队列的,不过在MessaegQueue中,消息按时间排放的,不到时间不会把它取出来,所以应该说延迟多少秒取出消息更合适。。

至于上边的getPostMessage(r)就是把r设置给callback。

private static Message getPostMessage(Runnable r) {
        Message m = Message.obtain();
        m.callback = r;
        return m;
    }

removeCallbacks:

  调用MQ的removeMessages方法。就是移出messageQueue中所有满足条件的message,当然前提是消息还没取走。

  /**
     * Remove any pending posts of Runnable r that are in the message queue.
     */
    public final void removeCallbacks(Runnable r)
    {
        mQueue.removeMessages(this, r, null);
    }
    /**
     * Remove any pending posts of Runnable <var>r</var> wit
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Android快乐贪吃蛇游戏实战项目开.. 下一篇Android快乐贪吃蛇游戏实战项目开..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目