Android清除图像网址缓存未清除

时间:2016-03-27 15:19:46

标签: android android-volley

我正在开发一款具有上传个人资料图片功能的Android应用。我面临的问题是,每当用户尝试上传新的个人资料图片时,它就会成功上传到lserver但是尝试通过排球库加载新图像并不反映新图像,ImageView仍会显示旧图像。我已经粘贴了凌空单例类实现,以便更清晰。

我尝试使用下面提到的两种方法清除缓存,但它不起作用。还试图通过invalidate()方法使ImageView无效,但这也不起作用,所以看起来更像是一个android缓存问题。

如果有人遇到类似的情况,请帮助。

1)mVolleySingleton.getRequestQueue()。getCache()。invalidate(urlProfileImage,true);
2)mVolleySingleton.getRequestQueue()。getCache()。remove(urlProfileImage);

Volley Singleton类实现:

public class VolleySingleton {
    private static VolleySingleton sInstance = null;
    private ImageLoader mImageLoader;
    private RequestQueue mRequestQueue;

    private VolleySingleton() {
        mRequestQueue = Volley.newRequestQueue(MainActivity.getAppContext());
        mImageLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache() {
            public LruCache<String, Bitmap> cache = new LruCache<>((int) (Runtime.getRuntime().maxMemory() / 1024) / 8);

            @Override
            public Bitmap getBitmap(String url) {
                return cache.get(url);
            }

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

    public static VolleySingleton getInstance() {
        if (sInstance == null) {
            sInstance = new VolleySingleton();
        }
        return sInstance;
    }

    public RequestQueue getRequestQueue() {
        return mRequestQueue;
    }

    public ImageLoader getImageLoader() {
        return mImageLoader;
    }
}

4 个答案:

答案 0 :(得分:0)

首先,像你一样VolleySingleton它将缓存iamge在LruCache和diskCache.you调用两个清除方法,如果清除它们?你必须检查它。

答案 1 :(得分:0)

你对mVolleySingleton.getRequestQueue()的调用.getCache()返回的不是ImageCache而是Http缓存(来自网络的缓存)

您需要访问imageLoder中声明的那个

public LruCache<String, Bitmap> cache = new LruCache<>((int) (Runtime.getRuntime().maxMemory() / 1024) / 8);

然后你可以打电话:

cache.evictAll()

删除所有缓存或

cache.remove(urlProfileImage)

仅删除1个项目

答案 2 :(得分:0)

更新针对特定网址的Volley ImageLoader缓存

1.上传新图片后,用android方式下载图片

2.在ImageLoader.java文件中放置UpdateImageInCache方法

3.在ImageLoader.java文件中更新getCacheKey方法

new ProfileActivity.DownloadImageFromURL((CircleImageView)findViewById(R.id.user_profile_module_photo)).execute(profileImageURL);

private class DownloadImageFromURL extends AsyncTask<String, Void, Bitmap> {
    CircleImageView imageView;

    public DownloadImageFromURL(CircleImageView imageView) {
        this.imageView = imageView;
        //Toast.makeText(getApplicationContext(), "Please wait, it may take a few minute...", Toast.LENGTH_SHORT).show();
    }

    protected Bitmap doInBackground(String... urls) {
        String imageURL = urls[0];
        Bitmap bimage = null;
        try {
            InputStream in = new java.net.URL(imageURL).openStream();
            bimage = BitmapFactory.decodeStream(in);
            if (imageLoader == null)
              imageLoader = AppController.getInstance().getImageLoader();
            // imageLoader.UpdateImageInCache("#W0#H0#S7"+profileImageURL,bimage);
              imageLoader.UpdateImageInCache(profileImageURL,bimage);

        } catch (Exception e) {
            Log.e("Error Message", e.getMessage());
            e.printStackTrace();
        }
        return bimage;
    }

    protected void onPostExecute(Bitmap result) {
        imageView.setImageBitmap(result);
    }

}

public void  UpdateImageInCache(String cacheKey, Bitmap response)
 {

        mCache.putBitmap(cacheKey, response);
        // remove the request from the list of in-flight requests.
        BatchedImageRequest request = mInFlightRequests.remove(cacheKey);

        if (request != null) {
            // Update the response bitmap.
            request.mResponseBitmap = response;

            // Send the batched response
            batchResponse(cacheKey, request);
        }
} 


 public static String getCacheKey(String url, int maxWidth, int maxHeight, ScaleType scaleType) {

    return  url;
    //return new StringBuilder(url.length() + 12).append("#W").append(maxWidth)
         //   .append("#H").append(maxHeight).append("#S").append(scaleType.ordinal()).append(url)
          //  .toString();
}

答案 3 :(得分:0)

LruBitmapCache你应该做的是put(url, bitmap)

 @Override
    public void putBitmap(String url, Bitmap bitmap) {
       // put(url, bitmap);
    }
通过这种方式每次调用凌空方法图像时都不要保存以捕捉