2012-03-15 1 views
4

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回のミスしかなく、他のものはですがヒットします。私は間違っているの?

+0

このコードは正常です。通常の理由で期限切れにならないと確信していますか? –

+0

パブリックstatic final int IMAGE_EXPIRATION_TIMEOUT = 7200; - 数秒で期限切れになるのはあまりにも遅いです – skayred

+0

タイムアウトはミリ秒単位です。つまり7秒です。メモリを大量に使用している場合は、 'softValues'がエントリをGCしている可能性があります。エビクトと理由を記録するRemovalListenerを追加してみてください。 –

答えて

4

さて、それを得ました。

.softValues()が原因で、私の値がガベージコレクタによって収集されました。私がこれをコメントしたとき、今はすべてうまく動作します。

+2

同時に3つの異なる有効期限の戦略は、とにかく少し過剰です。 (エントリごとに追加のメモリを使います。) –