防止android volley缓存图像

时间:2016-09-12 08:16:02

标签: android caching networking imageview android-volley

我有Volley网络ImageView,问题是当服务器凌空中的图像被更改时仍然使用旧的缓存图像,无论如何凌空都知道在服务器内部更改了图像?或者如果没有,我怎么能阻止它缓存?

这是我目前的代码:

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);
}

2 个答案:

答案 0 :(得分:3)

试试这个解决方案:

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);
}

答案 1 :(得分:3)

  1. 如果可以,则更改服务器的缓存策略。
  2. 您可以使用request.setShouldCache(false)为请求禁用缓存。
  3. 对于方法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。现在它不会将图像缓存到磁盘中。

    顺便说一句,您仍应将时间戳添加到网址,因为如果网址相同,NetworkImageView将无法再次加载图片。