1. LruCache 利用弱引用动态的管理内存(已经过时,但思想可以借鉴)
LruCache(Least Recently Used Cache) 全称最近最少使用算法,其主要思想是使用SoftReference(或者WeakReference),因为我们的缓存容量是有限的,它会面临一个问题:当有新的内容需要加入我们的缓存,但我们的缓存空闲的空间不足以放进新的内容时,我们就需要舍弃原有的部分内容从而腾出空间用来放新的内容。
在LruCache 中,我们使用url做key,bitmap做value,利用软引用的特性(在内存将满的时候会被垃圾回收器回收,如果还有可用内存,垃圾回收器不会)及时的回收内存,这种方式能够及时有效回收图片所占用的内存,但这些方法并未完全解决单个图片占用内存过大的问题,在程序运行的过程中,图片该多大还多大。我们只是控制在内存中存在图片对象的个数而已。
与Lru相似的还有Lfu,前者是最近最少使用,即淘汰最长时间未使用的对象;后者是最近最不常使用,即淘汰一段时间内使用最少的对象。比如我们缓存对象的顺序是:A B C B D A C A ,当需要淘汰一个对象时,如果采用LRU算法,则淘汰的是B,因为它是最长时间未被使用的。如果采用LFU算法,则淘汰的是D,因为在这段时间内它只被使用了一次,是最不经常使用的。
注意:对于SoftReference(软引用)或者WeakReference(弱引用)的Bitmap缓存方案,现在已经不推荐使用了。自Android2.3版本(API Level 9)开始,垃圾回收器更着重于对软/弱引用的回收。
与此种方法类似,我们可以使用硬盘缓存(DiskLruCache)来进行图片的管理,这种方法比LruCache 节省内存,但读取速度较慢(硬盘的读取速度是未知的)。
2. 按照一定规则压缩图片(以android为例)
Android中图片是以bitmap形式存在的,那么bitmap所占内存,直接影响到了应用所占内存大小。
bitmap所占内存大小计算方式:
图片长度 x 图片宽度 x 一个像素点占用的字节数
以下是图片的压缩格式:

其中,A代表透明度;R代表红色;G代表绿色;B代表蓝色。
ALPHA_8
表示8位Alpha位图,即A=8,一个像素点占用1个字节,它没有颜色,只有透明度
ARGB_4444
表示16位ARGB位图,即A=4,R=4,G=4,B=4,一个像素点占4+4+4+4=16位,2个字节
ARGB_8888
表示32位ARGB位图,即A=8,R=8,G=8,B=8,一个像素点占8+8+8+8=32位,4个字节
RGB_565
表示16位RGB位图,即R=5,G=6,B=5,它没有透明度,一个像素点占5+6+5=16位,2个字节