zoukankan      html  css  js  c++  java
  • 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位表示
  • 相关阅读:
    div 和 span的区别
    div 和 span的区别
    javascript类的定义及成员修改
    C# bho操作dom 同时带有隐藏工具栏功能,菜单栏
    javascript类的定义及成员修改
    数据库原理8个例子sql语句
    数据库原理8个例子sql语句
    C++的声明和定义的出别
    C++的声明和定义的出别
    Visual Studio 添加图标和版本
  • 原文地址:https://www.cnblogs.com/billshen/p/13308650.html
Copyright © 2011-2022 走看看