sponsored links

Picasso加载头像问题

概述

最近项目中碰到了用户上传头像之后,picasso加载用户头像显示的还是之前的头像的问题,原因是加载的图片地址没有变化,picasso加载时默认加载了缓存中的图片。

分析

在网上搜索了很多,大多的解决办法是这一种:

Picasso
        .with(context)
        .load(url)
        .memoryPolicy(MemoryPolicy.NO_CACHE)
        .networkPolicy(NetworkPolicy.NO_CACHE)
        .into(imageView);

通过调用
.memoryPolicy(MemoryPolicy.NO_CACHE)
.networkPolicy(NetworkPolicy.NO_CACHE)
不进行缓存,每次加载头像都通过网络加载
但是这样感觉很耗流量,体验效果不好
最好应该是能够在头像上传成功之后,清除之前的头像缓存,然后重新加载头像,重新给缓存
然后试着调用

Picasso.with(context).invalidate(url);

发现这样只能够清除磁盘缓存,不能清除内存缓存,需要退出app后清除内存缓存重新进入app才会显示上传后的头像。

实现

既然清理缓存没办法,只好通过修改url来实现,毕竟不同的url,picasso总不会自动加载缓存吧。
可以通过在url尾部加上时间戳值,这样请求的图片也不会变化。
对于不同图片格式的url,比如http://xxx.xxxx.com/xxxxx.jpg?xxxxxxxx可以在尾部加“&”+System.currentTimeMillis();比如Picasso加载头像问题

可以在尾部加“?”+System.currentTimeMillis()
我在项目中给定了一个全局变量mCurrentTime,在头像上传成功后

    Toast.makeText(context, "上传成功", Toast.LENGTH_SHORT).show();
    Picasso
            .with(context)
            .invalidate(url+"&"+mCurrentTime);
    mCurrentTime = System.currentTimeMillis();
    Picasso
            .with(context)
            .load(url+"&"+mCurrentTime)
            .resize(DensityUtil.dp2px(context,60),
                    DensityUtil.dp2px(context,60))
            .transform(new PicassoCircleTransform())
            .into(userImg);

先清除了之前头像的缓存,设置当前时间,加入到url尾部
一般显示头像就加载url+”&”+mCurrentTime地址就行了

其它诸如Glide等图片加载框架遇到这问题也可以这样解决。

Tags: