我们在android上发消息的时候,使用

后,发现整夜播放系统提示OOM,程序重启。将new Message()换成

后,内存泄露消失。

查了下android的source code,除了测试代码外,基本上都是使用后者方法,没有用前面的方法,确定是new Message泄露了。

继续追了下源码,终于看到问题了。就在Message.java中,可以看到问题的症结:

Message是通过一个message pool(消息池)来存储消息资源的,默认这个池子的大小是10个消息资源。代码片段:

这里可以看到,使用obtain()方法,会从池子里获取一个消息。 当没有可用的空余资源时,new一个。

再看一下,当looper处理完一个消息时,调用的recyle:

这里的意思就是,当looper用完一个消息后,调用recycle,当当前的pool size没达到MAX_POOL_SIZE的时候,将此消息归还给消息池子。

这里看起来也没啥问题,但通篇搜索了google的源代码,也没看到在哪里修改了mPoolSize。如果不改,这个值一直为0,那么不管是通过new Message()还是通过Message.obtain()方法获取的Message,都归还给Message Pool了。通过new出来的message就无法被GC掉,这样就是内存泄露!!

一个可行的修改方法(没测试)

按理说这是一个很小的问题,不知道google为何没修,而是所有的使用上都是通过obtain的方式来实现。是否有何讲究没?

更多相关文章

  1. Android中应用界面主题Theme使用方法和页面定时跳转应用
  2. G1安装android软件方法 (实机运行)
  3. (4.1.21.4)Android Handler 异步消息处理机制的妙用 创建强大的图
  4. android设置主题和自定义主题的方法
  5. android的消息处理机制(图+源码分析)——Looper,Handler,Message (
  6. android intent使用方法
  7. Android Push Notificatioin Service(Android消息推送)
  8. Android——消息机制中的Message Pool是个什么鬼,Message Pool会

随机推荐

  1. android开发之Parcelable使用详解
  2. Android下USB Accessory的实现分析 (三)---
  3. android nfc中MifareClassic格式的读写
  4. android-1-Android简单入门
  5. android开发中常用的设计模式汇总
  6. android 如何调用选择文件模块
  7. android怎么引入第三方包
  8. Android中为什么主线程不会因为Looper.lo
  9. Android 关于RatingBar评分条
  10. Android ORM 框架之 Android中ORMLite应