美文网首页
Android消息机制(一)Handler

Android消息机制(一)Handler

作者: 杨大魔王 | 来源:发表于2017-03-18 14:47 被阅读0次

    利用Handler机制,子线程更新UI

    使用上说:
    1.首先初始化一个handler

    Handler mHandler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                //更新UI
            }
        };
    

    2.当子线程需要更新UI时,采用Handler的发送消息方法,有send/post可选
    send方法一般传递一个message,也可以添加一些定时信息
    post方法一般传递一个Runnable

     new Thread(new Runnable() {
                @Override
                public void run() {
                    mHandler.sendMessage(new Message());
                }
            }).start();
    
    

    这样就从使用上完成了一个子线程更新UI操作

    分析过程

    我们能看到,消息的发送方法是由Handler发起的,最终又流入此Handler中

    首先要了解,handler中的两个成员

        final Looper mLooper;  //looper的对象
        final MessageQueue mQueue; //MessageQueue对象
    

    looper我们是消息循环,它做的是检查MessageQueue是否有message,有的话就让handler分发掉

    MessageQueue正如它字面的意思,是消息的队列,用来存放消息的

    那么从发送开始Handler做了什么?

    public final boolean sendMessage(Message msg)
        {
            return sendMessageDelayed(msg, 0);  //汇入下一层初始化发送
        }
    
    public final boolean sendMessageDelayed(Message msg, long delayMillis)
        {
            if (delayMillis < 0) {
                delayMillis = 0; //delayMillis 等待的毫秒
            }
            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);  //最终执行到添加到消息队列方法
        }
    

    以上代码我们看到,消息send后,经过多层次的构造成完整message+附带参数,最终到达Handler的enqueueMessage方法,这个方法属于Handler

    而现在来看Handler的enqueueMessage做了什么

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

    这里我们注意到msg.target = this;这个语句,把消息的目标设为Handler本身,这也就解释了为什么Handler发出的message最终回到Handler本身。
    最后调用MessageQueue的enqueueMessage方法,交给MessageQueue去添加消息
    handler使命暂时完成,等之后looper通知它分发MessageQueue中的消息。

    相关文章

      网友评论

          本文标题:Android消息机制(一)Handler

          本文链接:https://www.haomeiwen.com/subject/tssenttx.html