【发布时间】:2014-06-21 17:34:42
【问题描述】:
我目前正在开发一个前端应用程序,该应用程序严重依赖从网络服务下载的图像。为了简短起见,前端从我们的网络服务下载了一个给定的用户配置文件,其中包含 3 个图像槽。如果这样的用户上传了一张新图片(保持相同的 url),它不会刷新,直到我杀死我的应用程序,所以如果我把它放在后台并恢复,数据不会改变。
以下是处理 ImageNetworkView 的代码小示例:
mImage = (NetworkImageView) mView
.findViewById(R.id.profile_network_image);
mProgressBar = (ProgressBar) mView
.findViewById(R.id.profileProgressBar);
// Cargo image loader
mLoader = VolleySingleton.getInstance(mActivity).getImageLoader();
if(mLoader!=null && imageUrl!=null){
mLoader.get(imageUrl, new ImageListener() {
@Override
public void onErrorResponse(VolleyError error) {
System.out.println("Error loading "+imageUrl+"...");
}
@Override
public void onResponse(ImageContainer response, boolean isImmediate) {
if (response.getBitmap() != null) {
mImage.setImageBitmap(response.getBitmap());
mProgressBar.setVisibility(View.GONE);
System.out.println("Done loading "+imageUrl);
}
}
});
mImage.setImageUrl(imageUrl, mLoader);
这是我的 VolleySingleton 和 Cache 类:
public class VolleySingleton {
private static VolleySingleton mInstance = null;
private RequestQueue mRequestQueue;
private ImageLoader mImageLoader;
private ImageLoader.ImageCache mImageCache;
private VolleySingleton(Context context){
mRequestQueue = Volley.newRequestQueue(context);
mImageCache = new BitmapLruImageCache();
mImageLoader = new ImageLoader(this.mRequestQueue, mImageCache);
}
public static VolleySingleton getInstance(Context context){
if(mInstance == null){
mInstance = new VolleySingleton(context);
}
return mInstance;
}
public RequestQueue getRequestQueue(){
return this.mRequestQueue;
}
public ImageLoader getImageLoader(){
return this.mImageLoader;
}
public ImageLoader.ImageCache getImageCache(){
return mImageCache;
}
缓存类:
public class BitmapLruImageCache extends LruCache<String, Bitmap> implements ImageCache {
public static int getDefaultLruCacheSize() {
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
final int cacheSize = maxMemory / 8;
return cacheSize;
}
public BitmapLruImageCache() {
this(getDefaultLruCacheSize());
Log.v("tag", Integer.toString(getDefaultLruCacheSize()));
}
public BitmapLruImageCache(int sizeInKiloBytes) {
super(sizeInKiloBytes);
}
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight() / 1024;
}
@Override
public Bitmap getBitmap(String url) {
return get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
put(url, bitmap);
}
提前谢谢大家!
编辑:我一直在努力寻找解决方法,到目前为止我想出了这个:
如果我在调用 getBitmap(url) 时将新图像放在分配给图像 url 的缓存中,我将获得新图像,但如果我使用后退按钮关闭应用程序并再次打开它 volley 会加载旧图像,但如果我终止应用程序,它将加载新图像...这是我用来将图像放在缓存中的代码:
VolleySingleton.getInstance(mActivity).getImageCache().putBitmap(imageUrl, bmp);
tempBitmap = VolleySingleton.getInstance(mActivity).getImageCache().getBitmap(imageUrl);
【问题讨论】: