我的应用程序使用Volley网络库来缓存和从服务器获取数据,我需要在磁盘中缓存图像。在这里,我可以将数据写入磁盘,但DiskCache中的getBitmap()方法始终返回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();
}
}
}
答案 0 :(得分: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返回的byte []。因此,使用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);
}