Android消息机制Message消息池
来源:互联网 发布:Execl数据分析证书 编辑:程序博客网 时间:2024/05/22 15:30
这篇文章主要说下Android在实现Message类的时候使用的一个所谓的消息池的问题。
我们在使用Android的消息循环时,一般按照下面的方式使用,为了使线程具有消息循环如下:
//实现自己的Handler类,重写handlerMessage()方法
在线程的run()方法里调用Looper.prepare(),实例化一个Handler对象,调用Looper.loop()使线程进入消息循环
Handler对象的实例话必须在Looper.prepare()之后。
当我们要给具有消息循环的线程发送消息时,我们先要获得具有消息循环的线程的 Handler 对象(或者先获取具有消息循环的线程的Looper对象,再使用这个Looper对象构造Handler对象),构造一个Message对象,然后调用Handler对象的sendMessage方法
说了这么多,现在就来说下Message里的消息池问题,我们先看Message的静态成员方法 Message.obtain();
在这个类中sPool代表这个消息池的头消息,sPoolSize表示消息池中可用的消息的个数即没有被使用的Message对象的个数,next表示下一个可用的消息Message对象。
可以看到obtain()方法说会从全局消息池中取消息,假设是第一次获得一个Message对象,那么sPool肯定为null,也就说第一次获取消息Message对象时是还没有消息池的,必须通过Message的构造方法获取一个Message对象的,Message的构造方法什么也没干
那这就有点奇怪了,它的消息池是什么时候初始化呢?难道不是先new几个Message对象然后存着?这是我们注意到Message类的另一个成员方法recycle(),注意这个方法不是静态的.
里面的clearForRecycle()方法只是把一些成员变量置为null,以便垃圾回收
从这里我们就可以发现,消息池中Message的对象是通过recycle()放进去的. 但是我们自己并没有调用recycle()方法,那这个方法是在哪里调用的?看下Looper的源码就知道,在Looper的loop()方法的最后调用了Message对象msg的recycle()方法来回收这个Message对象,通过recycle()将这个Message对象的数据清空然后链接到消息池中(采用的头插法)。
- Android消息机制Message消息池
- Android消息机制Message消息池
- Android 消息机制 - Message
- android Message 消息处理机制
- Android 消息机制之Message
- Android中Message机制实现消息传递
- android消息处理机制(Looper,Handler,Message)
- android Handler 和Message消息机制
- android消息机制 Message, Looper,Handler
- 从零开始学android<Message消息机制.四十二.>
- android消息机制:Looper,Handler,Message
- Android消息处理机制--Looper,Handler,Message
- Android 消息机制,Looper、Handler、Message 解析
- Android消息机制之三---Message
- Android消息处理机制Message,Looper,Handler
- Android Handle,Looper,Message消息机制
- Android:消息机制(Message,Handler,Looper
- Android消息处理机制:Handler|Message
- Sublime配置SASS
- mybatis主键返回
- oracle的sys 用户密码是任意的
- IPERF Test for measuring the throughput/speed of a WLAN client.
- redis object对象系统的源码分析
- Android消息机制Message消息池
- C#使用ListView更新数据出现闪烁解决办法
- perl 批量生成分区表
- MySQL大数据量快速分页实现
- js 加法运算问题
- cvsba编译配置
- android移动支付——微信支付
- hbase RowFilter如何根据rowkey查询以及实例实现代码
- BZOJ2079: [Poi2010]Guilds