Android处理大图避免OOM的完整方案
1. 计算合适的缩放比例
使用 BitmapFactory.Options 的 inSampleSize 对图片进行采样压缩:
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
final int width = options.outWidth;
final int height = options.outHeight;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfWidth = width / 2;
final int halfHeight = height / 2;
while ((halfWidth / inSampleSize) >= reqWidth
&& (halfHeight / inSampleSize) >= reqHeight) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
2. 分步加载图片
- 步骤 1:仅读取图片尺寸(不分配内存)
BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(getResources(), R.drawable.large_image, options); int imageWidth = options.outWidth; int imageHeight = options.outHeight;
- 步骤 2:动态计算缩放比例并加载
options.inJustDecodeBounds = false; options.inSampleSize = calculateInSampleSize(options, targetWidth, targetHeight); Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.large_image, options);
3. 优化内存配置
使用更低的像素格式(如不需要透明度):
options.inPreferredConfig = Bitmap.Config.RGB_565; // 每个像素占 2 字节(内存减半)
禁用自动缩放(避免系统根据屏幕密度调整大小):
options.inScaled = false;
4. 按需加载局部区域(超大图场景)
使用 BitmapRegionDecoder 分块加载:
InputStream is = getAssets().open("large_image.jpg");
BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(is, false);
Rect rect = new Rect(startX, startY, startX + width, startY + height);
Bitmap bitmap = decoder.decodeRegion(rect, options);
5. 及时回收资源
在 onDestroy() 或不再需要 Bitmap 时主动回收:
if (bitmap != null && !bitmap.isRecycled()) {
bitmap.recycle();
bitmap = null;
}
避免在 onDraw() 中频繁创建 Bitmap(利用缓存或复用机制)。
6. 使用第三方库(推荐)
Glide:自动处理图片缩放、内存/磁盘缓存、生命周期管理。
Glide.with(context)
.load("path/to/image")
.override(targetWidth, targetHeight)
.into(imageView);
Picasso:类似 Glide,提供简洁的 API 管理大图。
7. 配置大堆或硬件加速
在 AndroidManifest.xml 中为 Activity 添加 largeHeap="true"(临时缓解,不推荐长期依赖):
<application android:largeHeap="true">
启用硬件加速(在部分场景下减少内存压力):
<activity android:hardwareAccelerated="true" />
关键公式:内存估算
内存占用 = 图片宽度 * 图片高度 * 每像素字节数 例如:4000x3000 的 ARGB_8888 图片 = 4000 * 3000 * 4B ≈ 48MB
通过上述策略,可显著降低内存占用,有效避免 OOM。实际开发中优先使用 Glide/Picasso 等成熟库,减少手动处理风险。
以上就是Android处理大图避免OOM的完整方案的详细内容,更多关于Android处理大图避免OOM的资料请关注脚本之家其它相关文章!
相关文章
Android webview 遇到android.os.FileUriExposedException错误解决办法
这篇文章主要介绍了Android webview 遇到android.os.FileUriExposedException错误解决办法的相关资料,希望通过本文能帮助到大家,让大家遇到这样的问题解决,需要的朋友可以参考下2017-10-10
Kotlin RadioGroup与ViewPager实现底层分页按钮方法
安卓的控件是挺多的,没有办法一个一个的来说明,我们挑出了一些重点的控件,组成一些常见的布局,这样以后在遇到相同功能的界面时,就会有自己的思路,或者进行复用2022-12-12
Android APK使用Debug签名重新打包 Eclipse更改默认Debug签名
这篇文章主要介绍了Android APK使用Debug签名重新打包 Eclipse更改默认Debug签名等内容,需要的朋友可以参考下2015-04-04


最新评论