使用Glide修复图片内存泄漏 解决高清图加载卡顿崩溃问题
嘿,我太懂你这问题了——加载全分辨率图片时卡顿甚至崩溃,这在Android开发里简直是家常便饭,核心原因就是内存溢出!你直接用BitmapFactory.decodeResource(mainImageUri)加载原图,那超大尺寸的Bitmap瞬间就把App的内存配额占满了,不崩才怪。下面给你两个靠谱的解决办法,从原生手动处理到第三方库都有,任你选:
方案一:原生手动采样缩放Bitmap
这是最基础的解决方案,通过BitmapFactory.Options的inSampleSize参数缩小图片,直接减少内存占用。
步骤拆解:
- 先获取原图宽高,不加载完整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;
- 计算合适的采样率
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; } }
- 用计算好的采样率加载缩小后的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这类成熟的图片库已经帮你搞定了自动采样、内存缓存、后台加载等所有细节,代码简洁还更稳定。
- 先在build.gradle里添加Glide依赖:
dependencies { implementation 'com.github.bumptech.glide:glide:4.15.1' annotationProcessor 'com.github.bumptech.glide:compiler:4.15.1' }
- 一行代码搞定图片加载,自动适配ImageView尺寸:
Glide.with(this) .load(mainImageUri) .centerCrop() // 可选缩放模式,根据你的UI需求换fitCenter也可以 .into(imageView);
优势:不仅不会卡顿崩溃,还会自动缓存图片,下次加载同一张图秒出;同时在后台线程处理图片,完全不阻塞UI线程。
额外注意点
- 永远不要加载比ImageView显示尺寸大很多的图片,纯纯浪费内存;
- 如果用原生方案,记得处理不同类型的URI(file://和content://),避免解码失败;
- 测试时尽量用最大分辨率的图片(比如手机相机拍的原图)验证修复效果。
内容的提问来源于stack exchange,提问作者Dranreb Benedicto
相关产品推荐
相关产品推荐

