安卓Java面试题 161- 170

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!
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

️ 邪神

你自己看着办,你喜欢打赏我就赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值