Bitmap问题

Bitmap是导致OOM的头号杀手,我在开发中就遇到了两个关于bitmap导致的内存泄漏。

1.pos机电子签名,需要在屏幕上面进行签名,创建了一个bitmap变量过大,导致的内存溢出。

2.使用照相机,扫描二维码,弹出来的预览画面需要放到临时变量里面,临时变量申请过大,导致内存溢出。

常用的总结操作如下:

1.recycle

Bitmap存在两个地方,java内存和native内存。recycle会释放和这个对象有关的native内存,和相关的引用。但是不是立即执行,而是通知GC。执行了recycle后,就不能执行相关的方法了,因为已经被标记为dead了,再调用相关方法会出现异常。google不建议主动去调用recycle方法,也会主动地清理内存。但是平时可以根据自己的场景来主动调用,养成良好习惯。

2.LRU

主要使用在存储bitmap的三级缓存,最近最少使用的缓存对象清除队列。

实现原理:通过泛型类,内部LinkedHashMap,提供对应的put get remove trimtosize(缓存满的时候移除较早较少使用的对象,添加新的缓存对象)。

3.计算inSamplesize

在合适的时间,加载合适的图片。根据maxWith,maxHeight计算最合适的inSampleSize,缩减比例。

4.缩略图

和inSampleSize分不开。

inJustDecodeBound,先设置为true。把图片加载进来,这是病不是真正的加载,而是获取到他的信息。然后在设置为false,计算出缩放比例,在设置为true。

5.三级缓存

1.网络,文件,内存;避免频繁的进行网络请求,导致ui卡顿。

你可能感兴趣的:(Bitmap问题)