Androidアプリケーションでグアバを使用して、画像のロードとファイル名のキャッシングを行っています。グアバファイルキャッシング
private static final LoadingCache<String, String> imageCache = CacheBuilder.newBuilder()
.softValues()
.initialCapacity(3000)
.maximumSize(3000)
.concurrencyLevel(12)
.expireAfterAccess(IMAGE_EXPIRATION_TIMEOUT, TimeUnit.SECONDS)
.build(new CacheLoader<String, String>() {
@Override
public String load(String key) throws Exception {
Log.d(TAG, "load " + key);
Bitmap bitmap = null;
final File imageFile = new File(cacheDir, "http---com-jWs-jpg");
return imageFile.getPath();
}
});
と使用:ここで
は私のキャッシュですString filename = imageCache.get(imageUrl);
Log.e(TAG, ">>> i:cache size :"+ imageCache.size() +":"+ imageCache.stats() +":"+ imageCache.asMap());
return Drawable.createFromPath(filename);
私の問題は、次のとおりです。私のリストでは12件のユニークなURLがありますが、私はミスカウントが大きすぎカウントがあります。
i:cache size :6:CacheStats{hitCount=36, missCount=48, loadSuccessCount=48, loadExceptionCount=0, totalLoadTime=46569827...)
単純な文字列(ファイルパスや単純に空の文字列など)を返すとき、私はわずか12回のミスしかなく、他のものはですがヒットします。私は間違っているの?
このコードは正常です。通常の理由で期限切れにならないと確信していますか? –
パブリックstatic final int IMAGE_EXPIRATION_TIMEOUT = 7200; - 数秒で期限切れになるのはあまりにも遅いです – skayred
タイムアウトはミリ秒単位です。つまり7秒です。メモリを大量に使用している場合は、 'softValues'がエントリをGCしている可能性があります。エビクトと理由を記録するRemovalListenerを追加してみてください。 –