举个例子,对于一张 1280×720 的图片,如果放在 xhdpi,那么 xhdpi 的设备拿到的大小还是 1280×720 而 xxhpi 的设备拿到的可能是 1920×1080,这两种情况在内存里的大小分别为:3.68M 和 8.29M,相差 4.61M,在移动设备来说这几 M 的差距还是很大的。尽管现在已经有比较先进的图片加载组件类似 Glide,Facebook Freso, 或者老牌 Universal-Image-Loader,但是有时就是需要手动拿到一个 bitmap 或者 drawable,特别是在一些可能会频繁调用的场景(比如 ListView 的 getView),怎样尽可能对 bitmap 进行复用呢?这里首先需要明确的是对同样的图片,要 尽可能复用,我们可以简单自己用 WeakReference 做一个 bitmap 缓存池,也可以用类似图片加载库写一个通用的 bitmap 缓存池,可以参考 GlideBitmapPool[8]的实现。
比如我们坐地铁的时候,假设你没带公交卡去坐地铁,地铁的售票机就只支持 5 元,10 元,而哪怕你这个时候身上有 1 万张 1 块的都没用(是不是觉得很反人类..)。当然你可以去兑换 5 元,10 元,而在 Android 系统里就没那么幸运了,系统会直接拒绝为你分配内存,并扔一个 OOM 给你(有人说 Android 系统并不会对 Heap 中空闲内存区域做碎片整理,待验证)。其他常用数据结构优化,ArrayMap 及 SparseArray 是 android 的系统 API,是专门为移动设备而定制的。用于在一定情况下取代 HashMap 而达到节省内存的目的,具体性能见 HashMap,ArrayMap,SparseArray 源码分析及性能对比[10],对于 key 为 int 的 HashMap 尽量使用 SparceArray 替代,大概可以省 30%的内存,而对于其他类型,ArrayMap 对内存的节省实际并不明显,10%左右,但是数据量在 1000 以上时,查找速度可能会变慢。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |