-1

私のアプリケーションは、サーバーからのデータのキャッシュと取得に 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();
    }
}

}

4

1 に答える 1

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);
        }
于 2013-10-15T13:11:46.797 に答える