排除NetworkImageView清除caching的图像

有没有人知道是否有可能使用Google Googles Volley库从单个NetworkImageView中清除caching的图像?

我有一个NetworkImageView中的头像图像,并希望显示新的图像,一旦我已经上传到服务器。 此刻如果我做profileImg.setImageUrl("myUrl", mImageLoader); 我得到caching的图像。

Solutions Collecting From Web of "排除NetworkImageView清除caching的图像"

看一下这个 :

1) closurescaching:如果你想禁用一个特定的URL的caching,你可以使用setShouldCache()方法如下。

 StringRequest stringReq = new StringRequest(....); stringReq.setShouldCache(false); 

2) 删除特定URL的caching :使用remove()删除URL的caching。

 yourRequestQueue.getCache().remove(url); 

3) 删除所有的caching

 yourRequestQueue.getCache().clear(url); 

另外, 在这里查看这个链接。

希望这可以帮助。

所以迟到回答我自己的问题。 我最终采取了不同的方法来确保我总是获得最新的头像图片,结果非常简单。

而不是尝试从caching中清除单个图像我使用下面的方法。

 int time = (int) (System.currentTimeMillis());//gets the current time in milliseconds String myUrl = "www.mySite.com?timestamp=" + String.ValueOf(time); profileImg.setImageUrl("myUrl", mImageLoader); 

这是做一个虚构的参数附加到我打电话来获取图像与当前的时间戳。 这保证我总是打电话给一个唯一的url,因此总是得到该图像的最新版本。

这种方法的美妙之处在于它不仅限于Volley,而且可以用来selectnetworking电话。

在LruBitmapCache你应该做diable put(url,bitmap):

  @Override public void putBitmap(String url, Bitmap bitmap) { // put(url, bitmap); } 

通过这种方式每次你打电话给抽象的方法图像不保存赶上

  To turn off the cache: 1 request.setShouldCache(false); to remove the cache for a specific request: 1 queue.getCache().remove(url); to clear all cache: 1 queue.getCache().clear(); to invalidate the cache: this will allow to display the cached data until the response is received. When the response is received, it will automatically override the cached data. 1 queue.getCache().invalidate(url, true); for more details you can refer to the url:http://androidresearch.wordpress.com/2014/02/01/android-volley-tutorial/ 

如果你像这样创buildcaching:

 RequestQueue requests = Volley.newRequestQueue( context ); BitmapCache cache = new BitmapCache(cacheSize); ImageLoader loader = new ImageLoader( requests, cache ); 

你可以清除所有这些:

 public void clear () { cache.evictAll(); requests.getCache().clear(); } 

我创build了volleySingleton类。 我从ImageLoader加载图像。 我有删除caching的要求,但无法做到这一点。 使用所有这三种方法

1)删除特定URL的caching:使用remove()删除URL的caching。

。VolleySingleton.getInstance()getRequestQueue()getCache()除去(的ImageUrl)。; 2)删除所有的caching:

。VolleySingleton.getInstance()getRequestQueue()getCache()清除()。;

3)VolleySingleton.getInstance()。getRequestQueue()。getCache()。invalidate(ImageUrl,true);

我已经尝试过所有这些,但是cashe不会被删除

长答案包含一个解决scheme,允许您从ImageLoader清除caching的图像。 假设您正在使用singleton方法在android volley文档中看到。

使用compile 'com.android.volley:volley:1.0.0'


创build一个覆盖ImageLoader的类,例如MyImageLoader 。 这将用于replace默认的ImageLoader,你可以在这里调用removeImage

MyImageLoader.java

 public class MyImageLoader extends ImageLoader { protected RequestQueue mQueue; protected MyImageCache mImageCache; public MyImageLoader(RequestQueue queue, MyImageCache imageCache) { super(queue, imageCache); mQueue = queue; mImageCache = imageCache; } public void removeImage(String url) { // ImageLoader.java default parameters removeImage(url, 0, 0); } public void removeImage(String url, int maxWidth, int maxHeight) { // ImageLoader.java default parameters removeImage(url, maxWidth, maxHeight, ImageView.ScaleType.CENTER_INSIDE); } public void removeImage(String url, int maxWidth, int maxHeight, ImageView.ScaleType scaleType) { // remove from L1 cache if (mImageCache != null) mImageCache.removeBitmap(url, maxWidth, maxHeight, scaleType); // tell cache to remove the image file if (mQueue != null && mQueue.getCache() != null) mQueue.getCache().remove(url); } public void invalidateImage(String url, boolean fullExpire) { // ImageLoader.java default parameters invalidateImage(url, 0, 0, fullExpire); } public void invalidateImage(String url, int maxWidth, int maxHeight, boolean fullExpire) { // ImageLoader.java default parameters invalidateImage(url, 0, 0, ImageView.ScaleType.CENTER, fullExpire); } public void invalidateImage(String url, int maxWidth, int maxHeight, ImageView.ScaleType scaleType, boolean fullExpire) { // remove from L1 cache if (mImageCache != null) mImageCache.removeBitmap(url, maxWidth, maxHeight, scaleType); // tell cache to invalidate image file if (mQueue != null && mQueue.getCache() != null) mQueue.getCache().invalidate(url, fullExpire); } } 

ImageLoader.ImageCache的实现MyImageCache到一个类中,例如MyImageCache

警告:这可能会有所不同,因为您可能没有使用LruCache ,请相应地更改此类

MyImageCache.java

 public class MyImageCache implements ImageLoader.ImageCache { // TODO this is the part that maybe different on your implementations private final LruCache<String, Bitmap> cache = new LruCache<>(10); @Override public Bitmap getBitmap(String url) { return cache.get(url); } @Override public void putBitmap(String url, Bitmap bitmap) { cache.put(url, bitmap); } public Bitmap removeBitmap(String url, int maxWidth, int maxHeight, ImageView.ScaleType scaleType) { return cache.remove(getCacheKey(url, maxWidth, maxHeight, scaleType)); } /** Copied from ImageLoader.java in the Volley library */ private String getCacheKey(String url, int maxWidth, int maxHeight, ImageView.ScaleType scaleType) { return new StringBuilder(url.length() + 12).append("#W").append(maxWidth) .append("#H").append(maxHeight).append("#S").append(scaleType.ordinal()).append(url) .toString(); } } 

您需要创buildMyImageLoader

 MyImageLoader imageLoader = new MyImageLoader(yourRequestQueue, new MyImageCache()); 

现在您需要在调用NetworkImageView.setImageUrl(url, imageLoader);使用MyImageLoader NetworkImageView.setImageUrl(url, imageLoader);

例如,如果您有一个,请更改您的RequestQueueSingleton

 public MyImageLoader getImageLoader() { return mImageLoader; } 

好现在怎么用?

你可以像//载入NetworkImageView imgView = findViewById(R.id.networkimageview); imgView.setImageUrl(imgUrl,RequestQueueSingleton()。getInstance()。getImageLoader());`

 // clear image from cache RequestQueueSingleton.getInstance().getImageLoader().removeImage(imgUrl, imgView.getWidth(), imgView.getHeight()); 

或者直接使用MyImageLoader

 // load RequestQueueSingleton.getInstance().getImageLoader().get(imgurl, listener); // clear image from cache RequestQueueSingleton.getInstance().getImageLoader().removeImage(imgUrl); 

一个陷阱列表

  • NetworkImageView将图像存储在包含maxWidth,maxHeight和scaleType (#W100#H100#S7http://argh.com/img.png)的前缀URL中的“L1caching”中,这意味着您必须使用NetworkImageView的大小正好在图像请求时。
  • 仅仅因为你已经从caching中删除了一个图片并不意味着你可以用相同的图片url调用setImageUrl() ,并期待它刷新。 如果它是相同的url,则需要首先使用空白url调用setImageUrl("",...) ,因为如果URL与以前相同, NetworkImageView将不会调用服务器。
  • 如果您直接使用ImageLoader来调用图像url,则只需将用于'get()'的相同参数(大小)传递到'removeImage()'/'invalidateImage()'

请随时清理我的答案。 谢谢你,享受。