【问题标题】:Preventing android volley from caching image防止android volley缓存图像
【发布时间】:2017-01-19 15:13:54
【问题描述】:

我有 Volley 网络 ImageView,问题是在服务器内部更改图像时,volley 仍然使用旧的缓存图像,无论如何,volley 是否理解服务器内部更改的图像?或者如果没有,我怎样才能防止它缓存?

这是我当前的代码:

private void networkImage(){
    String url = "http://example.com/profilePictures/"+username+".jpg";

    networkImageView = (NetworkImageView) findViewById(R.id.IBProfilePicture);
    networkImageView.setOnClickListener(this);

    RequestQueue networkQueue = Volley.newRequestQueue(getApplicationContext());
    networkQueue.getCache().remove(url);
    networkQueue.getCache().clear();
    ImageLoader networkImageLoader = new ImageLoader(networkQueue, new ImageLoader.ImageCache() {
        @Override
        public Bitmap getBitmap(String url) {
            return null;
        }

        @Override
        public void putBitmap(String url, Bitmap bitmap) {

        }
    });

    networkImageView.setImageUrl(url,networkImageLoader);
}

【问题讨论】:

标签: android caching networking imageview android-volley


【解决方案1】:
  1. 尽可能更改服务器的缓存策略。
  2. 您可以使用request.setShouldCache(false) 为请求禁用缓存。

对于方法 2,您可以通过覆盖 ImageLoader.makeImageRequest() 来做到这一点;

public class NoCacheImageLoader extends ImageLoader {
    public NoCacheImageLoader(RequestQueue queue, ImageCache imageCache) {
        super(queue, imageCache);
    }

    @Override
    protected Request<Bitmap> makeImageRequest(String requestUrl, int maxWidth, int maxHeight, ImageView.ScaleType scaleType, String cacheKey) {
        Request<Bitmap> request =  super.makeImageRequest(requestUrl, maxWidth, maxHeight, scaleType, cacheKey);
        // key method
        request.setShouldCache(false);
        return request;
    }
}

然后使用NoCacheImageLoader 而不是ImageLoader。现在它不会将图像缓存到磁盘中。

顺便说一句,你还是应该在url中添加时间戳,因为如果url相同,NetworkImageView将不会再次加载图像。

【讨论】:

  • 所以我想没有存储问题了?
【解决方案2】:

试试这个解决方案:

private void networkImage(){
    String url = "http://example.com/profilePictures/"+username+".jpg";

    networkImageView = (NetworkImageView) findViewById(R.id.IBProfilePicture);
    networkImageView.setOnClickListener(this);

    RequestQueue networkQueue = Volley.newRequestQueue(getApplicationContext());
    ImageLoader networkImageLoader = new ImageLoader(networkQueue, new ImageLoader.ImageCache() {
        @Override
        public Bitmap getBitmap(String url) {
            return null;
        }

        @Override
        public void putBitmap(String url, Bitmap bitmap) {

        }
    });

    networkImageView.setImageUrl(url+"?time="+System.currentTimeMillis(),networkImageLoader);
}

【讨论】:

  • 它工作得很好,但是所有这些缓存的图像都会填满存储空间,不是吗?
  • 是的,它为您的图像制作其他存储缓存。在您的情况下,仅更新了个人资料图片,我认为存储没有问题。
  • 首先谢谢,缓存有限制吗?我的意思是应用程序将包含一百多个可以查看彼此的个人资料的用户,如果缓存有限制并且不会填满整个存储空间,我可以接受。
猜你喜欢
  • 2014-08-13
  • 2013-10-24
  • 2014-03-17
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 2014-02-12
  • 2023-03-29
相关资源
最近更新 更多