Android Handler 消息机制

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

http://www.07net01.com/program/571329.html

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

Handler

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

小结:

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

Looper

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

  1. 在prepare的时候,创建一个Looper,同时在Looper的构造方法中创建一个消息队列MessageQueue,同时将Looper保存到ThreadLocal中(这个是关于ThreadLocal的,不太懂,以后研究了再说)
  2. 调用loop进入消息循环,此处其实就是不断到MessageQueue中取消息Message,进行处理

MessageQueue:  重点
enqueueMessage函数: 将Message插入到有序的消息队列中
next()方法: 获取下一个消息,会阻塞
重点: MessageQueue.next   原理(这也是Handler发送的延迟消息能比较准时执行的原因)
nativePollOnce(mPtr, nextPollTimeoutMillis)  阻塞等待nextPollTimeoutMillis毫秒的时间返回,与Object.wait(long timeout)相似
  小结:
  1. MessageQueue作为一个容器,保存了所有待执行的消息。
  2. MessageQueue中的Message包含三种类型:普通的同步消息,Sync barrier(target = null),异步消息(isAsynchronous() = true)。
  3. MessageQueue的核心函数为enqueueMessage和next,前者用于向容器内添加Message,而Looper通过后者从MessageQueue中获取消息,并实现无消息情况下的等待。
  4. MessageQueue把Android消息机制的Java实现和C++实现联系起来。
底层C++部分待后续研究:
  相关的C++ Class:
  • android.NativeMessageQueue
  • android.Looper
  • android.LooperCallback
  • android.SimpleLooperCallback
  • android.Message
  • android.MessageHandler


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值