Android消息机制学习笔记

Android的消息机制主要是指Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支撑;

MessageQueue:消息队列,它的内存存储了一组消息,以队列的形式对外提供插入和删除的工作,内部结构:采用

单链表的数据结构来存储消息队列;

Looper:处理MessageQueue的消息,会以无限循环的形式去查找是否有新消息,有就处理无则等待,还要用到一个特殊的概念-ThreadLocal:并不是线程,作用:可以在每个线程中存储数据,

ThreadLocal可以在不同的线程中互不干扰地存储并提供数据,通过ThreadLocal可以轻松获取每个线程的Looper。线程默认是没有Looper的,如果需要使用Handler就必须为线程创建Looper;

UI线程即ActivityThread,ActivityThread被创建是就会初始化Looper,这也是在主线程中默认可以使用Handler的原因。

Handler创建完毕后,Looper和MessageQueue、Handler就可以一起协同工作了,1.通过Handler的post方法将一个Runnable投递到Handler内部的Looper中取处理

2.通过Handler的send方法发送一个消息,这个消息同样会在Looper中去处理;其中post方法最终也是通过send方法来完成;

send的过程:当Handler的send方法被调用时,它会调用MessageQueue的enqueueMessage方法将这个消息放入消息队列中,然后Looper发现有新的到来时,就会处理这个消息,

最终消息中的Runnable或者Handler的handleMessage方法就会被调用。注意Looper是运行在创建Handler所在的线程中的,这样一来Handler中的业务逻辑就被切换到创建Handler所在的

线程中去执行了。

 Message的callback是一个Runnable对象,实际上就是Handler的post方法所传递的Runnable参数

Handler的工作原理

Handler工作主要包含消息的发送和接收过程,通过post的一系列方法以及send的一系列方法来实现,而post方法最总是通过send的一系列方法来实现的。

Handler最总会交给dispatchMessage方法调用,而检查的Message的Callback实际上是Handler的post方法所传递的Runnable参数

Callback可以代替创建Hander的实例而去使用handler

Handler是必须通过Looper来构造Handler.

public void dispatchMessage(Message msg){
    if(msg.callback != null){
    //当message是runnable的情况,也就是Handler的post方法传递的参数,这种情况下直接执行runnable的run方法
        handleCallback(msg);
    } else {
        if(mCallback != null){{//如果创建Handler的时候是给Handler设置了Callback接口的实现,那么此时调用该实现的handleMessage方法
            if(mCallback.handleMessage(msg)){
                return;
            }
        }
        handleMessage(msg);//如果是派生Handler的子类,就要重写handleMessage方法,那么此时就是调用子类实现的handleMessage方法
    }
}
public Handler(Looper looper){
    this(looper, null, false);
}
原文地址:https://www.cnblogs.com/banzhuan/p/6853391.html