Android中的Bitmap
1. recycle方法
- 该方法是系统提供的,可以用来回收bitmap占用的堆内存以及native内存,同时清除该对象的引用。
- 该操作不可逆,如果调用了recycle(),再次加载图片,则会抛出异常。所以,需要确保该图片不会被再次使用时才可以调用recycle
- Android系统建议我们不要主动调用该方法,因为图片如果没有被引用的对象时,GC会主动释放图片占用的内存
2. LRU算法
它的主要算法原理是把最近使用的对象用强引用存储在 LinkedHashMap 中,并且把最近最少使用的对象在缓存值达到预设定值之前从内存中移除。
内部使用LinkedHashMap来缓存key-value的对应关系,提供put和get方法便于缓存内容的添加和获取。同时也提供remove方法删除key对应的value。当缓存达到预设值时,会调用trimToSize方法,把较早的缓存对象移除,以便存放新的缓存。
3. 计算inSampleSize
使用BitmapFactory去decode一张大图时,往往会发生OOM,所以,我们计算一个合适的sampleSize是减少图片加载内存的一个重要手段。首先,设置inJustDecodeBounds为true,decodeFile并不占用空间,但是可以拿到原图的宽高,即options.width和options.height,通过一定的计算,就能够计算出合适的inSampleSize。根据该值,可以少加载图片像素到内存中,自然内存占用就会减少。
4. 缩略图
换句话说,加载缩略图,是将一个稍大的图片,加载更小尺寸到内存,也就是用到了上面的inSampleSize。
5. 三级缓存
从网络上加载过一个图片之后,把原图或者所需的分辨率的图片缓存到文件或者内存中,再次加载该图片时只需从内存或者文件中读取,而不再需要从网络上获取,效率更高,更省内存。目前主流的图片加载框架都会有该部分逻辑(值得一提的是Glide会缓存原图和你用过的分辨率的图片,所以加载速度最快)