我正在开发一款具有上传个人资料图片功能的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;
}
}
答案 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);
}
通过这种方式每次调用凌空方法图像时都不要保存以捕捉