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位表示
  • 相关阅读:
    C++调用WebService
    vs2005 环境的字体和颜色的设置
    自娱自乐~经典24点游戏
    再探利用C++的STL和堆栈编程思想实现数学四则运算计算结果
    如何在Linux中关闭apache服务(转)
    ios推送:本地通知UILocalNotification
    ASIHTTPRequest的使用(转)
    实战新浪微博、腾讯微博的分享功能(转)
    UIImagePickerController拍照与摄像(转)
    iOS通过http post上传图片 (转)
  • 原文地址:https://www.cnblogs.com/billshen/p/13308650.html
Copyright © 2011-2022 走看看