You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android加载ImageView遇OOM错误求助:960×1440 Bitmap分配失败

解决Android加载图片到ImageView时的OOM问题

问题原因

你遇到的OOM并非因为图片尺寸“看起来”不大,而是Android的资源缩放机制导致的:

  • 系统会根据设备的屏幕密度(dpi)自动缩放drawable文件夹中的图片。比如Samsung Galaxy A02属于hdpi(240dpi)级别,若你的图片放在默认的drawable文件夹(对应mdpi),系统会将其放大1.5倍,实际加载的是1440×2160的位图。
  • 若图片采用ARGB_8888格式(默认),每个像素占4字节,这张缩放后的图片需要约12MB内存,再加上应用本身的内存占用,就可能触发OOM。

快速解决方法

1. 调整图片存放的drawable目录

这是最简单的方案:

  • 将图片放到与设备密度匹配的文件夹,比如drawable-hdpi;
  • 或者放到drawable-nodpi文件夹,强制系统不缩放图片,直接加载原始尺寸。

2. 手动采样缩小图片加载

通过BitmapFactory.Options控制加载的分辨率,避免不必要的内存占用:

myImageView = findViewById(R.id.my_image_view);
// 等待View完成测量后获取实际尺寸
myImageView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        myImageView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        int targetWidth = myImageView.getWidth();
        int targetHeight = myImageView.getHeight();

        BitmapFactory.Options options = new BitmapFactory.Options();
        // 先获取图片原始尺寸,不加载到内存
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(getResources(), R.drawable.background_picture, options);
        int originalWidth = options.outWidth;
        int originalHeight = options.outHeight;

        // 计算采样率,确保图片缩小后适配ImageView
        int sampleSize = 1;
        while ((originalHeight / sampleSize) > targetHeight || (originalWidth / sampleSize) > targetWidth) {
            sampleSize *= 2;
        }

        // 加载缩小后的图片
        options.inJustDecodeBounds = false;
        options.inSampleSize = sampleSize;
        options.inPreferredConfig = Bitmap.Config.RGB_565; // 用RGB_565节省一半内存(每个像素2字节)
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.background_picture, options);
        myImageView.setImageBitmap(bitmap);
    }
});

3. 使用图片加载库(省心首选)

像Glide、Picasso这类库会自动处理图片缩放、内存缓存和OOM问题,一行代码就能解决:

// Glide示例,需先添加依赖
Glide.with(this).load(R.drawable.background_picture).into(myImageView);

内容的提问来源于stack exchange,提问作者Adam Varhegyi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 23:37:31