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