解决安卓开发上传文件到服务器后,smartImageView的缓存问题

SmartImageView 是一款轻量级的网络图片加载组件,十分的好用,只需要导入相应的jar包即可调用。

相信许多学安卓的开发者都使用过吧,如果没用过的过的话。也可以了解一下其缓存机制。

废话不多说,如果你遇到以下是情况:

出现该情况的原因:

手机硬盘上缓存的图片,及运行内存中存放的缓存图片未被删除

观察

ebimage下的代码

public static void removeFromCache(String var0) {
    if (webImageCache != null) {
        webImageCache.remove(var0);
    }

}

webImageCache的代码就不贴了,在smartImageView.jar目录下有兴趣的可以自己查看

也就是说SmartImageView里面有自带清除缓存的方法。 很是激动的调用了一下,(肯定很多人也这样做了吧 - -)

但是事实上,没有用呀!!!!楼主真的是因为这个问题纠结了好久好久!!

终于(这里没有转折的话,看到这篇博客的人就要失望了吧哈哈)

最后通过ADM观察生成缓存文件的目录下发现,调用这个方法其实并没有清除掉里面的shen生成的缓存文件

说一下我的解决之道吧,比较暴力。(为什么没有删除下面会解释,有兴趣的人可以看)

打开smartImageview.jar的WebImageCache,把他复制下来

并且新建一个工具类DeleCacheache,把代码直接黏贴过来。

只需修改其构造方法,还有remote方法,加入参数Handler,来进行异步消息处理。如图

(不知道Handler异步消息处理机制的话,建议先去了解一下,不然下面可能比较难理解)

private static final String DISK_CACHE_PATH = "/web_image_cache/";
private ConcurrentHashMap<String, SoftReference<Bitmap>> memoryCache = new ConcurrentHashMap();
private String diskCachePath;
private boolean diskCacheEnabled = false;
private ExecutorService writeThread;
private Handler h;//加上的Handler
private Context c;

//构造方法

public DeleteCache(Context var1, Handler h) {
    this.h=h;
    c=var1;
    Context var2 = var1.getApplicationContext();
    this.diskCachePath = var2.getCacheDir().getAbsolutePath() + "/web_image_cache/";
 //   Toast.makeText(c, this.diskCachePath+"",Toast.LENGTH_SHORT).show();
    File var3 = new File(this.diskCachePath);

    this.diskCacheEnabled = var3.exists();
    this.writeThread = Executors.newSingleThreadExecutor();

}

//remove方法

public void remove(String var1) {
 WebImage.removeFromCache(var1);//加上清除运存
    if(var1 != null) {
        File var2 = new File(this.diskCachePath, this.getCacheKey(var1));
        if(var2.exists() && var2.isFile()) {
            var2.delete();
           Toast.makeText(c,"删除成功!!"+var2.getName(),Toast.LENGTH_SHORT).show();
            Message m=new Message();
            m.what=300;
            h.sendMessage(m);
        }

    }
}

其他不需要变动

解析如下:

1、当清除掉硬盘上的缓存文件时会Toast提示删除掉哪个缓存文件

2、利用Handler来让监听删除是否完成,删除成功后发送what=300,300里面的则是重新设置图像路径。代码如下

 其实就是 等他删除完硬盘的缓存文件后再去访问这条链接下的图片。 

case 300:
    siv.setImageUrl(getString(R.string.url) + imgurl);
    break;

这样就完成了清除硬盘上的缓存文件了,然而运行了一下,还是有这种情况,但是清除一下内存重新打开就能显示新的

头像了,没错!!还差运行内存中的缓存没清除呢

清除运存的就比较简单了,直接调用自带的方法就行了

public void remove(String var1) {
    WebImage.removeFromCache(var1);//加上清除运存
    if(var1 != null) {
        File var2 = new File(this.diskCachePath, this.getCacheKey(var1));
        if(var2.exists() && var2.isFile()) {
            var2.delete();
           Toast.makeText(c,"删除成功!!"+var2.getName(),Toast.LENGTH_SHORT).show();
            Message m=new Message();
            m.what=300;
            h.sendMessage(m);
        }

    }
}

以上就是解决SmartImageView 上传头像时的缓存问题的方案了。

 

ps(注意!!如果上传头像和显示头像是写在两个不同页面,上传时一定要等他上传彻底完成后再finish()关闭掉上传页面

转发请指明出处,如果能够帮到你,那是我的荣幸。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值