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

Android更新头像需重启App才刷新CircleImageView问题

问题根源

头像不自动刷新是Picasso的默认缓存机制导致的。你更新头像后,如果存储在数据库里的图片访问路径没有变化,Picasso会直接读取本地已经缓存的旧头像资源,不会主动向服务端拉取最新图片,只有重启应用清空内存缓存后,才会重新请求新的头像内容。

修复方案

你可以根据自己的需求选下面任意一种方案修改,都是基于你现有代码调整,不需要大改逻辑:

  • 方案1:加载头像时强制跳过缓存
    直接替换你原来加载头像的Picasso代码,配置内存和网络层都不读取、不存储缓存,每次加载都拉取最新资源:
    // 先导入需要的类
    // import com.squareup.picasso.MemoryPolicy;
    // import com.squareup.picasso.NetworkPolicy;
    
    Picasso.get()
        .load(prfImage)
        .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)
        .networkPolicy(NetworkPolicy.NO_CACHE, NetworkPolicy.NO_STORE)
        .into(profileImage);
    
    这个方案实现简单,但缺点是每次加载头像都要走网络请求,浪费流量、加载速度慢,不适合日常频繁加载头像的场景。
  • 方案2:头像更新后给图片地址加动态参数(推荐)
    平时加载头像保留Picasso的缓存机制保证加载速度,只有在你执行完头像上传更新操作、接口返回成功之后,重新拉取用户数据加载头像时,给图片地址拼接一个动态时间戳参数。图片地址参数变化后,Picasso会将其识别为新资源,自动拉取最新图片,不会读取旧缓存:
    // 头像更新成功后,加载头像时拼接时间戳
    String refreshAvatarUrl = prfImage + "?t=" + System.currentTimeMillis();
    Picasso.get().load(refreshAvatarUrl).into(profileImage);
    
  • 补充必要逻辑:你在头像上传接口的成功回调里,必须主动调用一次putAllUserData(当前登录用户名),主动触发最新用户数据的拉取,不要等页面自动重载,否则即使缓存配置正确,也不会主动拿到最新的头像地址。

内容的提问来源于stack exchange,提问作者Federico Alie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:09:20