Android Handler 消息机制

    xiaoxiao2021-03-25  97

    Android消息机制不完全解析(上)(native层待研究)

    http://www.07net01.com/program/571329.html Message类:     主要提供了一些成员,用以保存消息数据   when :  消息处理时间   next :  形成链表   值得一提的是,Android提供了一个简单,但是有用的消息池,对于Message这种使用频繁的类型,可以有效的减少内存申请和释放的次     数,提高性能。   小结: Message的核心在于它的数据域,Handler根据这些内容来识别和处理消息应该使用Message.obtain(或者Handler.obtainMessage)函数获取message实例

    Handler

       Handler的构造函数最主要的就是初始化成员变量:mLooper和mQueue。    Handler.post系列和send系列函数最终都会调用enqueueMessage函数,把message入列,不同之处在于post系列函数会以Runable参    数构建一个Message实例。 Handler.dispatchMessage:

    小结:

     Handler类最为核心的函数是enqueueMessage和dispatcherMessage,前者把待处理的消息放入MessageQueue,而Looper调用后者来处理从MessageQueue获取的消息。 callback不为null(通过post系列函数添加到消息队列中)的message无法被拦截,而callback为null的函数可以被Handler的mCallback拦截

    Looper

        private Looper(boolean quitAllowed) {         mQueue = new MessageQueue(quitAllowed);         mThread = Thread.currentThread();     }

    在prepare的时候,创建一个Looper,同时在Looper的构造方法中创建一个消息队列MessageQueue,同时将Looper保存到ThreadLocal中(这个是关于ThreadLocal的,不太懂,以后研究了再说) 调用loop进入消息循环,此处其实就是不断到MessageQueue中取消息Message,进行处理 MessageQueue:  重点 enqueueMessage函数: 将Message插入到有序的消息队列中 next()方法: 获取下一个消息,会阻塞 重点: MessageQueue.next   原理(这也是Handler发送的延迟消息能比较准时执行的原因) nativePollOnce(mPtr, nextPollTimeoutMillis)  阻塞等待nextPollTimeoutMillis毫秒的时间返回,与Object.wait(long timeout)相似   小结: MessageQueue作为一个容器,保存了所有待执行的消息。MessageQueue中的Message包含三种类型:普通的同步消息,Sync barrier(target = null),异步消息(isAsynchronous() = true)。MessageQueue的核心函数为enqueueMessage和next,前者用于向容器内添加Message,而Looper通过后者从MessageQueue中获取消息,并实现无消息情况下的等待。MessageQueue把Android消息机制的Java实现和C++实现联系起来。 底层C++部分待后续研究:   相关的C++ Class: android.NativeMessageQueueandroid.Looperandroid.LooperCallbackandroid.SimpleLooperCallbackandroid.Messageandroid.MessageHandler
    转载请注明原文地址: https://ju.6miu.com/read-19275.html

    最新回复(0)