跟安卓系统在图像内存管理方面的“糊涂”比起来,图片品质还真算不上个事,质量差点大家还能忍,内存管理不当则会导致应用的崩溃(OOM :Out of Memory)可就真没人能忍了。 Bitmap很占内存,那到底会占多少内存呢?计算起来很简单,如果你需要显示一个长宽均为612个像素的正方形图片,对应的Bitmap对象需要612*612*4=1498176个字节的内存,即大约不到1.5MB的内存。这种级别的内存消耗,在开发桌面应用时,问题不大,反正这么多年了,大家已经习惯了不管三七二十一,所有的内存都归我用。到了移动互联网时代,那可就不行了,智能手机操作系统(如iOS和Android)严格限制了每个应用能够使用的内存空间,超了您就崩溃出去吧,千万别影响到其它应用的正常运行。
关于图像内存管理中的OOM问题,基本上每位安卓开发者都遇到过,网上搜一下,能找到各种“神奇”的解决方案,比如说: 1、减小图片的显示尺寸,不使用ARGB_8888(32位),而是选择使用ARGB_4444(16位)甚至是RGB_565(8位)。嗯,遇到问题不是想着怎么解决,而是选择用更小、更差的显示品质来代替,这思路,赞!按这种逻辑,无图应用最省内存,大家都去开发无图应用好了。 2、显式的回收图片内存,也就是手工的recycle一个Bitmap对象。听起来这还真像是正道,需要内存的时候分配,不需要的时候回收,这总该没问题了吧?其实这种解决方案假定的是安卓系统的垃圾回收效率低甚至有可能不可靠,这种写法嘛,遇到ListView里不断滚屏显示图片的需求(这也算得上是很基本的需求了吧?),总会遇到这样那样的古怪问题,不是“outof memory”,就是“trying to use a recycled bitmap”,反正就一个字“崩”! 3、设置Bitmap对象为软引用(Soft Reference),频繁的手动调用垃圾回收(GarbageCollection)。需要请求大一点的内存空间之前,先gc一下,释放点儿内存,让崩溃的概率低一些。这的确算的上个招数,但也仅仅是治标不治本,让崩溃的概率稍微低上那么一点点。