1、Bitmap 内存占用的计算
占用的内存 = width * height * nTargetDensity/inDensity * nTargetDensity/inDensity * 一个像素所占的内存。
- ARGB_8888: 每个像素4字节. 共32位,默认设置。
- Alpha_8: 只保存透明度,共8位,1字节。
- ARGB_4444: 共16位,2字节。
- RGB_565:共16位,2字节,只存储RGB值。
2、getByteCount() & getAllocationByteCount()的区别
- 不复用的情况
如果不使用内存复用,这两个方法是一样的效果。 - 复用的情况
在通过复用 Bitmap 来解码图片时,那么 getByteCount() 表示新解码图片占用内存的大 小,getAllocationByteCount() 表示被复用 Bitmap真实占用的内存大小。
可以认为:
- getByteCount()只是图片的大小
- getAllocationByteCount()是Bitmap的大小
因为Bitmap可以复用,所以Bitmap可以放入不同的图片,当Bitmap放入更大的图片的时候,就会占用更大的内存,但是这个时候如果对Bitmap对象进行复用,放入一张小图片,并不会改变Bitmap的大小。
举例说明:
比如,最初Bitmap放入一张大小为4M的图片,这个时候Bitmap占用了4M的内存,然后当这张图片使用完成之后,对Bitmap进行复用,放入一张1M的图片,这个时候其实只是复用了Bitmap之前内存大小的四分之一,如果使用getByteCount(),得到的其实就是1M,但是这个时候Bitmap对象实际占用内存其实还是4M,虽然对Bitmap进行了复用,但是并不会因为放入的图片变小了而改变了原本Bitmap对象占用内存的大小,所以getAllocationByteCount()返回的是4M。
3、Bitmap的压缩方式
- 质量压缩:内存不变,压缩转化后的 bytes.length 减少,适用于传输,png 无效
- 采样率压缩(Options):改变宽高,减少像素,采用一定的采样算法
- 缩放法压缩(Matrix):改变宽高,减少像素,采用一定的缩放算法(数字图像处理相关)
- RGB_565:改变字节数
4、LruCache & DiskLruCache原理
5、如何设计一个图片加载框架
6、有一张非常大的图片,如何去加载这张大图片
7、如果在hdpi、xxhdpi下放置了图片,加载的优先级。如果是400800,10801920,加载的优先级
优先会去更高密度的文件夹下找这张图片,我们当前的场景就是drawable-xxxhdpi文件夹,然后发现这里也没有android_logo这张图,接下来会尝试再找更高密度的文件夹,发现没有更高密度的了,这个时候会去drawable-nodpi文件夹找这张图,发现也没有,那么就会去更低密度的文件夹下面找,依次是drawable-xhdpi -> drawable-hdpi -> drawable-mdpi -> drawable-ldp
0dpi ~ 120dpi ldpi
120dpi ~ 160dpi mdpi
160dpi ~ 240dpi hdpi
240dpi ~ 320dpi xhdpi
320dpi ~ 480dpi xxhdpi
480dpi ~ 640dpi xxxhdpi