Android消息机制之Message分析

在整个消息机制中,message又称为task,它封装了任务携带的信息和处理该任务的handler。尽管Message有public的默认构造方式,但是读者应该通过Message.obtain()来从消息池中获取空消息对象,以节约资源;除非消息池中没有空消息对象,就先new()消息。

下面分析下Message类的属性结构部分:

public final class Message implements  Parcelable {

   /**用户定义的消息代码,以便接收者(Handler)可以识别这个消息是关于什么的。 每个处理程序(Handle)
     都有自己的消息代码名称空间,因此您不必担心与其他处理程序(Handler)发生冲突。**/
    public int what;

   //这两个参数,如果用户只需要存储几个整数值,相比较于setData(Bundle)setData(),代价更低
    public int arg1; 
    public int arg2;

    /**这是一个发送给接受者的一个随意的数据,如果使用Messager来进行发送数据进行跨进程的通信,那么当前
     的obj如果实现了Parcelable就一定不能够为空指针,对于其他的数据的传输,我们一般使用setData方法就
     可以了。但是需要注意的是,对于高于android.os.Build.VERSION_CODES#FROYO的版本,这里的Parcelable
     对象是不支持的。 **/
    public Object obj;

    //可选的Messenger,可以发送对此消息的回复。如何使用的语义取决于发送者和接收者。
    public Messenger replyTo;

    /*package*/ static final int FLAG_IN_USE = 1 << 0;  //标记消息被使用

    /*package*/ static final int FLAG_ASYNCHRONOUS = 1 << 1; // 标记消息是异步

    //flags表示这个Message有没有在使用,1表示在池中,等待复用,0表示正在被使用
    /*package*/ int flags;

    //Message发送之后,何时才能被处理
    /*package*/ long when;
    
    //Message所携带的数据 
    /*package*/ Bundle data;
    
    //表示这个消息被哪个Handler处理
    /*package*/ Handler target;

    //用Handler.post一个Runnable,这个Runnable也是被包装成Message对象的
    /*package*/ Runnable callback;
    
    // 表示下一个可用的消息(记录链表中的下一个元素)
    /*package*/ Message next;
    
    //第一个变量其实就是充当锁的作用,避免多线程争抢资源,导致脏数据
    private static final Object sPoolSync = new Object();

    //sPool代码消息池的头消息
    private static Message sPool;

    //sPoolSize表示有多少个可以被重用的对象(消息池中可用的消息个数即没有被使用的Message对象的个数)
    private static int sPoolSize = 0;  //记录链表长度

    //定义队列缓存消息的最大的长度(表示链表的最大长度)
    private static final int MAX_POOL_SIZE = 50;

    //消息池存放的核心方法
    private static boolean gCheckRecycle = true;

猜你喜欢

转载自blog.csdn.net/warticles/article/details/80924271