Android面试题:大图加载,防止OOM

时间:2020-07-15
本文章向大家介绍Android面试题:大图加载,防止OOM,主要包括Android面试题:大图加载,防止OOM使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

这是字节面试官问的一个问题,平时Glide用惯了,让我说大图加载原理答不上来。

大图如果直接加载到内存,往往会导致OOM,因为大图所占内存非常大。

Bitmap直接加载

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.hqimage);
imageView.setImageBitmap(bitmap);

直接从资源中加载,方法非常简单,拿到Bitmap对象然后塞入ImageView中即可。这方式小图片还能正常加载,大图片就有问题了。

大图加载步骤

  1. 获取大图尺寸
  2. 获取ImageVIew的尺寸,缩放减小内存
  3. 加载

大图尺寸获取

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.qb, options);

执行结果可以看到bitmap并未加载,而是获取到了图片的大小:outHeight和outWidth

 减小内存

  1. 根据ImageView大小计算缩放比例inSampleSize
  2. 选择占内存小的颜色模式,设置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位表示

原文地址:https://www.cnblogs.com/billshen/p/13308650.html