161. 使用new Message()和obtainMessage两种方式得到Message对象有什么区别 ? |
我们在平常使用Handler sendMessage方法的时候都要传递Message参数进去,通常创建Message对象有两种方式,一种就是常用的通过构造函数的方式创建对象, 一种就是通过Handler的obtainMessage了,既然都能new了说明Message的构造函数是public的,那么还来个 obtainMessage干嘛呢?答案就是为了节省内存资源,如果你查看Message的定义的话,会发现它里面有一个next字段,这个字段的属性值 是Message类型的,所以从这种角度看的话Message本身就可以作为链表存在,我们的Message消息池其实就是存储着第一个Message消 息而已,之后的消息都是通过next字段链接到一起的,使用obtainMessage首 先会去查看当前消息池中有没有消息存在,存在的话则直接取到该消息并且将该消息从消息池中删除同时将消息池大小减一即可,也就是将链表长度减一,如果消息 池中不存在消息的话才会通过new Message的方式创建消息出来,我们每次使用完消息之后通过执行Message的recycle会将当前使用过的消息对象添加到消息池中,也就是加入 链表中,当然在加入之前需要将原消息中的内容信息全部置位,这样有效减缓了你频繁通过new Message方式创建消息的内存开销,保证了只有在当前消息池不再存在可用消息的情况下才去创建消息出来,so perfect! |