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

使用Glide修复图片内存泄漏 解决高清图加载卡顿崩溃问题

嘿,我太懂你这问题了——加载全分辨率图片时卡顿甚至崩溃,这在Android开发里简直是家常便饭,核心原因就是内存溢出!你直接用BitmapFactory.decodeResource(mainImageUri)加载原图,那超大尺寸的Bitmap瞬间就把App的内存配额占满了,不崩才怪。下面给你两个靠谱的解决办法,从原生手动处理到第三方库都有,任你选:

方案一:原生手动采样缩放Bitmap

这是最基础的解决方案,通过BitmapFactory.Options的inSampleSize参数缩小图片,直接减少内存占用。

步骤拆解:

  1. 先获取原图宽高,不加载完整Bitmap到内存:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true; // 只读取尺寸,不实际加载Bitmap
// 注意:如果你的URI是content://类型(比如相册选图),要换成ContentResolver获取输入流
if (mainImageUri.getScheme().equals("content")) {
    InputStream inputStream = getContentResolver().openInputStream(mainImageUri);
    BitmapFactory.decodeStream(inputStream, null, options);
} else {
    BitmapFactory.decodeFile(mainImageUri.getPath(), options);
}
int originalWidth = options.outWidth;
int originalHeight = options.outHeight;
  1. 计算合适的采样率inSampleSize(根据ImageView的实际显示尺寸来算):
// 先获取ImageView的目标显示宽高
int targetWidth = imageView.getWidth();
int targetHeight = imageView.getHeight();

int inSampleSize = 1;
// 找到最大的采样率,让缩放后的图片仍能覆盖ImageView的尺寸
if (originalHeight > targetHeight || originalWidth > targetWidth) {
    final int halfHeight = originalHeight / 2;
    final int halfWidth = originalWidth / 2;
    while ((halfHeight / inSampleSize) >= targetHeight
           && (halfWidth / inSampleSize) >= targetWidth) {
        inSampleSize *= 2;
    }
}
  1. 用计算好的采样率加载缩小后的Bitmap:
options.inJustDecodeBounds = false;
options.inSampleSize = inSampleSize;
options.inPreferredConfig = Bitmap.Config.RGB_565; // 比ARGB_8888省一半内存,不需要透明通道的话强烈推荐
Bitmap scaledBitmap = null;
if (mainImageUri.getScheme().equals("content")) {
    InputStream inputStream = getContentResolver().openInputStream(mainImageUri);
    scaledBitmap = BitmapFactory.decodeStream(inputStream, null, options);
} else {
    scaledBitmap = BitmapFactory.decodeFile(mainImageUri.getPath(), options);
}
imageView.setImageBitmap(scaledBitmap);

额外提醒:在Activity销毁或者不需要这个Bitmap时,记得调用scaledBitmap.recycle()释放内存,避免内存泄漏。

方案二:用Glide等图片加载库(更推荐)

手动写采样逻辑容易踩坑,而Glide这类成熟的图片库已经帮你搞定了自动采样、内存缓存、后台加载等所有细节,代码简洁还更稳定。

  1. 先在build.gradle里添加Glide依赖:
dependencies {
    implementation 'com.github.bumptech.glide:glide:4.15.1'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.15.1'
}
  1. 一行代码搞定图片加载,自动适配ImageView尺寸:
Glide.with(this)
     .load(mainImageUri)
     .centerCrop() // 可选缩放模式,根据你的UI需求换fitCenter也可以
     .into(imageView);

优势:不仅不会卡顿崩溃,还会自动缓存图片,下次加载同一张图秒出;同时在后台线程处理图片,完全不阻塞UI线程。

额外注意点
  • 永远不要加载比ImageView显示尺寸大很多的图片,纯纯浪费内存;
  • 如果用原生方案,记得处理不同类型的URI(file://和content://),避免解码失败;
  • 测试时尽量用最大分辨率的图片(比如手机相机拍的原图)验证修复效果。

内容的提问来源于stack exchange,提问作者Dranreb Benedicto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:20:22