1、
2、
对于Bitmap来说,它对于内存优化至关重要,因为图片非常地耗内存。而且Bitmap的内存模型是经过了平台的变化的。在API10之前Bitap自身存在Dalvik Heap中,但是与之相关联的像素存在Native中。这样有一个好处是像素存在native中不占用java层的内存。OOM 不会发生在native当中。这样有一个不好的地方,比如java中的bitmap已经被回收掉了,但是在native中的像素并不知道,就是说回收时机并不确定。在API10之后像素也被放到了Dalvik Heap中。也就是二者被放在了一起。就是说Bitmap被回收了,这些像素也就被回收了。在API26之后,谷歌通过一种更优的方式,继续将像素存在了native中。相当于加了一种机制,在java层bitmap被回收了,可以很迅速地通知到native层。
3、
获取Bitmap占用的内存:
有几个方案,第一点:对Bitmap这个类来说,它有一个方法getByteCount(),这个方法直接返回了这个Bitmap自身所占的内存。但是这种情况是需要在运行时动态算出来的。
第二种方式:宽*高*一像素占用的内存。一般情况下,该方式计算出来的就是bitmap所占用的内存,但是有例外。比如说,放在资源目录里,res目录里面,此时需要*压缩比例。
4、
可以继承一个ImageView,覆写onDraw()方法,绘制时进行判断,判断控件的宽度、高度,比对一下这个控件绑定的bitmap,它的宽度和高度,进行一下对比。如果说比例超过了一定的限制,可以给一个警告。
也可以给imageview加一个predraw()listemer,也就是在绘制之前加一个回调。
5、
6、
7、
8、
9、