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
相关产品推荐
相关产品推荐

