2013-09-22 1 views
-1

Mon application utilise la bibliothèque réseau Volley pour la mise en cache et l'obtention de données à partir du serveur, j'ai besoin de mettre en cache les images sur le disque. Ici, je peux écrire des données sur le disque, mais ma méthode getBitmap() dans DiskCache renvoie toujours null.DiskBased Image cache renvoie null

Voici ma mise en œuvre cache disque

public class DiskCache extends DiskBasedCache implements ImageCache{ 

public DiskCache(File cacheDir) { 
    super(cacheDir); 
} 


public DiskCache(File rootDirectory, int maxCacheSizeInBytes) { 
    super(rootDirectory, maxCacheSizeInBytes); 
    // TODO Auto-generated constructor stub 
} 

@Override 
public Bitmap getBitmap(String url) { 
    // TODO Auto-generated method stub 
    final Entry requestedItem = get(url); 

    if (requestedItem == null){ 
     LogUtils.LOGI("CACHE", "NO Valid Entry"); 
     return null;} 

    return BitmapFactory.decodeByteArray(requestedItem.data, 0, requestedItem.data.length); 
} 


@Override 
public void putBitmap(String url, Bitmap bitmap) { 
    // TODO Auto-generated method stub 

    final Entry entry = new Entry(); 

    ByteBuffer buffer = ByteBuffer.allocate(getByteSize(bitmap)); 
    bitmap.copyPixelsToBuffer(buffer); 
    entry.data = buffer.array(); 

    put(url, entry); 
} 
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1) 
public int getByteSize(Bitmap bitmap){ 

    if(UIUtils.hasHoneycombMR1()){ 
     return bitmap.getByteCount(); 
    } 
    else{ 
     return bitmap.getRowBytes()*bitmap.getHeight(); 
    } 
} 

}

Répondre

1

Apparemment, le ImageLoader n'initialise pas le cache correctement. Ajustez votre classe DiskCache pour appeler initialize(); après le super() - appel.

public DiskCache(File cacheDir) { 
    super(cacheDir); 
    initialize(); 
} 


public DiskCache(File rootDirectory, int maxCacheSizeInBytes) { 
    super(rootDirectory, maxCacheSizeInBytes); 
    initialize(); 
    // TODO Auto-generated constructor stub 
} 

Je trouve que BitmapFactory.decodeByteArray ne peut pas décoder l'octet [] retour de bitmap.copyPixelsToBuffer. Obtenez donc des données décodables en utilisant bitmap.compress. Un exemple de travail est la mise en œuvre suivante:

public void putBitmap(String url, Bitmap bitmap) { 
      Entry entry = new Entry(); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); 
      entry.data = baos.toByteArray(); 
      super.put(url, entry); 
     } 
+0

Une question? Ici, lorsque vous spécifiez le format de compression au format PNG, existe-t-il un moyen de le garder générique pour qu'il fonctionne bien avec le format PNG, JPG, etc.? –