【问题标题】:Is there any way to force Volley to refresh an image?有没有办法强制 Volley 刷新图像?
【发布时间】: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);

【问题讨论】:

    标签: android android-volley


    【解决方案1】:

    问题是图像缓存在内存中,ImageLoader 会在打电话之前检查它。

            // Try to look up the request in the cache of remote images.
        Bitmap cachedBitmap = mCache.getBitmap(cacheKey);
        if (cachedBitmap != null) {
            // Return the cached bitmap.
            ImageContainer container = new ImageContainer(cachedBitmap, requestUrl, null, null);
            imageListener.onResponse(container, true);
            return container;
        }
    

    您需要手动清理缓存:

    VolleySingleton.getInstance(mActivity).getImageCache().remove(imageUrl);
    

    VolleySingleton.getInstance(mActivity).getImageCache().evictAll()

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 2016-01-11
      • 1970-01-01
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多