【问题标题】:DiskBased Image cache returns nullDiskBased 图像缓存返回 null
【发布时间】:2013-09-22 14:48:31
【问题描述】:

我的应用程序使用 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();
    }
}

}

【问题讨论】:

    标签: android android-volley


    【解决方案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);
            }
    

    【讨论】:

    • 一个问题?在这里,当您将压缩格式指定为 PNG 时,有没有办法让它保持通用,以便它适用于 PNG 以及 JPG 等?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 2016-03-22
    • 1970-01-01
    • 2010-10-19
    • 2021-08-08
    • 1970-01-01
    相关资源
    最近更新 更多