这是字节面试官问的一个问题,平时Glide用惯了,让我说大图加载原理答不上来。
大图如果直接加载到内存,往往会导致OOM,因为大图所占内存非常大。
Bitmap直接加载
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.hqimage);
imageView.setImageBitmap(bitmap);
直接从资源中加载,方法非常简单,拿到Bitmap对象然后塞入ImageView中即可。这方式小图片还能正常加载,大图片就有问题了。
大图加载步骤
- 获取大图尺寸
- 获取ImageVIew的尺寸,缩放减小内存
- 加载
大图尺寸获取
BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.qb, options);
执行结果可以看到bitmap并未加载,而是获取到了图片的大小:outHeight和outWidth
减小内存
- 根据ImageView大小计算缩放比例inSampleSize
- 选择占内存小的颜色模式,设置option.inPreferredConfig,有以下值可以选择
参数取值 | 含义 |
ALPHA_8 | 图片中每个像素用一个字节(8位)存储,该字节存储的是图片8位的透明度值 |
RGB_565 | 图片中每个像素用两个字节(16位)存储,两个字节中高5位表示红色通道,中间6位表示绿色通道,低5位表示蓝色通道 |
ARGB_4444 | 图片中每个像素用两个字节(16位)存储,Alpha,R,G,B四个通道每个通道用4位表示 |
ARGB_8888 | 图片中每个像素用四个字节(32位)存储,Alpha,R,G,B四个通道每个通道用8位表示 |