2014-05-05 2 views
5

Je travaille actuellement sur une application frontale qui dépend fortement des images téléchargées depuis un webservice. Pour être bref, le frontal télécharge à partir de notre service Web un profil utilisateur donné avec 3 emplacements d'image. Si un utilisateur télécharge une nouvelle image (en gardant la même URL), il ne se rafraîchira pas tant que je ne tuerai pas mon application, donc si je devais le mettre en arrière-plan et que je reprendrai, les données ne seront pas modifiées.Existe-t-il un moyen de forcer Volley à actualiser une image?

Voici un petit échantillon du code qui traite de la 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); 

Voici mes deux VolleySingleton et les classes 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; 
} 

classe Cache:

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

Merci d'avance à tous!

EDIT: J'ai essayé de trouver une solution de contournement et à ce jour je suis venu avec ceci:

Si je devais placer la nouvelle image sur le cache attribué à l'URL de l'image quand je l'appelle GetBitmap (url) Je vais obtenir la nouvelle image, mais le problème persiste, si je ferme l'application avec le bouton retour et l'ouvre une fois de plus la volée charge l'ancienne image mais si je tue l'application, elle chargera la nouvelle .. Voici le code que j'ai utilisé pour placer l'image sur le cache:

VolleySingleton.getInstance(mActivity).getImageCache().putBitmap(imageUrl, bmp); 

tempBitmap = VolleySingleton.getInstance(mActivity).getImageCache().getBitmap(imageUrl); 

Répondre

0

le fait est que le cache d'image est dans la mémoire et le ImageLoader vérifiera cela avant même de faire un appel.

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

Vous aurez besoin de nettoyer le cache manuellement:

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

ou

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

Questions connexes