Android删除同名图片后用Uri加载新图仍显示旧图问题
解决ImageView加载新图片却显示旧图的问题
看起来你遇到的麻烦是:每次选完新图片后,ImageView死活显示旧的那张,这大概率是缓存冲突加上文件处理逻辑的小问题导致的。咱们一步步拆解修复:
问题根源分析
- 固定文件名+语法错误:你代码里
var fileName: String? = abc少了引号(应该是"abc"),而且固定文件名会让Glide觉得这是同一个文件,直接读缓存不加载新内容。 - Glide缓存未强制刷新:Glide默认会缓存文件内容,哪怕你替换了同名文件,它也可能不主动重新读取。
- 文件删除逻辑冗余:重复调用多次删除方法,却没确保旧文件真的被清理干净,也没通知系统更新文件索引。
- 代码结构错误:把
getImageUri函数定义在try代码块内部,这不符合Kotlin语法,函数得放在类的成员位置或者顶层。
修复后的完整代码
下面是修正后的代码,关键修改我都标出来了:
// 把getImageUri移到类的成员位置,不要嵌套在代码块里 private fun getImageUri(context: Context, inImage: Bitmap): String { // 用时间戳生成唯一文件名,从根源避免缓存冲突 val fileName = "image_${System.currentTimeMillis()}.jpg" val directory = File(Environment.getExternalStorageDirectory().toString() + File.separator + "myDirectory") // 先确保保存目录存在,避免创建文件失败 if (!directory.exists()) { directory.mkdirs() } val file = File(directory, fileName) // 兜底判断:如果文件意外存在就删除 if (file.exists()) { file.delete() } try { file.createNewFile() // 使用use自动管理流,不用手动flush/close,避免资源泄漏 FileOutputStream(file).use { fOut -> inImage.compress(Bitmap.CompressFormat.JPEG, 40, fOut) } // 强制Glide跳过缓存,加载最新文件 Glide.with(context) .load(file) .skipMemoryCache(true) // 跳过内存缓存 .diskCacheStrategy(DiskCacheStrategy.NONE) // 跳过磁盘缓存 .into(imageView!!) // 通知系统MediaStore更新文件索引,避免读取旧数据 context.contentResolver.notifyChange(Uri.fromFile(file), null) } catch (ex: Exception) { ex.printStackTrace() } return file.absolutePath } // 图片选择回调的处理逻辑 if (resultCode == Activity.RESULT_OK && requestCode == IMAGE_PICK_CODE_GALLERY) { val selectedImage = data?.data ?: return // 空判断,避免空指针崩溃 try { val bitmap = MediaStore.Images.Media.getBitmap(context?.contentResolver, selectedImage) bitmap?.let { val imageURI = getImageUri(context!!, it) // 这里可以用imageURI做后续操作,比如存到数据库 } } catch (ex: Exception) { ex.printStackTrace() } }
关键修改说明
- 唯一文件名:用
System.currentTimeMillis()生成文件名后缀,确保每次保存的文件都不一样,从根源解决缓存混淆问题。 - Glide强制刷新:添加
skipMemoryCache(true)和diskCacheStrategy(DiskCacheStrategy.NONE),让Glide每次都重新读取文件内容,不依赖缓存。 - 优化流处理:用
use函数自动管理文件输出流,避免手动关闭流导致的资源泄漏。 - 通知系统更新:调用
contentResolver.notifyChange,让系统感知到文件变化,避免其他地方读取到旧的文件信息。
这样修改后,每次选择新图片都会生成唯一的新文件,Glide也会加载最新内容,不会再显示旧图片啦。
内容的提问来源于stack exchange,提问作者md shoaib
相关产品推荐
相关产品推荐

