解决安卓开发上传文件到服务器后,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()关闭掉上传页面
)
转发请指明出处,如果能够帮到你,那是我的荣幸。