Volley NetworkImageView清除缓存的图像

时间:2014-08-13 13:10:20

标签: android android-volley

有人知道是否可以使用Googles Volley库从单个NetworkImageView清除缓存的图像?

我在NetworkImageView中有一个头像图像,并希望在我将其上传到服务器后显示新图像。目前,如果我这样做  profileImg.setImageUrl("myUrl", mImageLoader);我收到了缓存的图片。

6 个答案:

答案 0 :(得分:5)

检查出来:

1)关闭缓存     如果要禁用特定URL的缓存,可以使用如下的setShouldCache()方法。

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

2)删除特定网址的缓存:使用remove()删除网址缓存。

yourRequestQueue.getCache().remove(url);

3)删除所有缓存

yourRequestQueue.getCache().clear(url);

另外,请查看此链接here

希望这有帮助。

答案 1 :(得分:3)

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

我没有尝试从缓存中清除单个图像,而是使用以下方法。

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,而且您可以选择拨打网络电话。

答案 2 :(得分:0)

  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/

答案 3 :(得分:0)

如果您像这样创建缓存:

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

你可以清除这一切:

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

答案 4 :(得分:0)

我创建了volleySingleton类。我从ImageLoader加载图像。我要求删除缓存但不能这样做。使用了所有这三种方法

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

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

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

3)  。VolleySingleton.getInstance()getRequestQueue()getCache()无效(的ImageUrl,真);

我已经尝试了所有这些但是cashe没有被删除

答案 5 :(得分:0)

包含允许您从ImageLoader清除缓存图像的解决方案的长答案。假设您正在使用android volley文档中的singleton方法。

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

创建一个覆盖ImageLoader的类,例如MyImageLoader。这将用于替换默认的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

警告:这可能会有所不同,因为您可能没有使用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();
    }
}

您需要创建MyImageLoader

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

现在您需要在MyImageLoader

的通话中使用NetworkImageView.setImageUrl(url, imageLoader);

例如,如果您有一个<{p>},请更改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将图像存储在“L1缓存”中,其带有包含maxWidth,maxHeight和scaleType 的前缀URL(#W100#H100#S7http://argh.com/img.png)这意味着您必须在发出图像请求时使用NetworkImageView的大小完全删除图像。
  • 仅仅因为您从缓存中删除了图片并不意味着您可以使用相同的图片网址调用setImageUrl()并期望它刷新。如果它是相同的网址,则您需要首先使用空白网址调用setImageUrl("",...),因为NetworkImageView如果网址与以前相同,则不会拨打服务器。
  • 如果您直接使用ImageLoader来调用图片网址,则只需将用于“get()”的相同参数(大小)传递给“removeImage()”/“invalidateImage()”

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