2013-09-22 4 views
-1

Мое приложение использует сетевую библиотеку Volley для кэширования и получения данных с сервера, мне нужно кэшировать изображения на диске. Здесь я могу записывать данные на диск, но мой метод getBitmap() в DiskCache всегда возвращает null.DiskBased Image cache возвращает null

Ниже мой DiskCache Реализация

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

}

ответ

1

Видимо ImageLoader не инициализировать кэш должным образом. Отрегулируйте класс DiskCache, чтобы вызвать initialize(); после вызова super().

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


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

Тогда я обнаружил, что BitmapFactory.decodeByteArray не может декодировать байт [] вернулся из bitmap.copyPixelsToBuffer. Так что получите декодируемые данные с помощью bitmap.compress. Рабочим примером является следующая реализация:

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

Один вопрос? Здесь, когда вы указываете формат сжатия PNG, существует ли способ сохранить его общий, чтобы он хорошо работал с PNG, а также JPG и т. Д.? –