2013-07-15 12 views
6

私はたくさんの(リモート)画像でリストビューを表示しようとしています。私は仕事にボレーを使用しようとしています。ボレーとビットマップキャッシング

ボレーはやや効いていますが、十分ではありません。 ImageLoader.getにボレーは、次のコードを有する。

final String cacheKey = getCacheKey(requestUrl, maxWidth, maxHeight); 

    // Try to look up the request in the cache of remote images. 
    Bitmap cachedBitmap = mCache.getBitmap(cacheKey); 
    if (cachedBitmap != null) { 
     // Return the cached bitmap. 
     ImageContainer container = new ImageContainer(cachedBitmap, requestUrl, null, null); 
     imageListener.onResponse(container, true); 
     return container; 
    } 

しかし、getCacheKeyこのようなキーを生成する:

/** 
* Creates a cache key for use with the L1 cache. 
* @param url The URL of the request. 
* @param maxWidth The max-width of the output. 
* @param maxHeight The max-height of the output. 
*/ 
private static String getCacheKey(String url, int maxWidth, int maxHeight) { 
    return new StringBuilder(url.length() + 12).append("#W").append(maxWidth) 
      .append("#H").append(maxHeight).append(url).toString(); 
} 

すなわち、キーに幅と高さのようないくつかの「メタデータ」を付加します。

このキーは決してでヒットし、イメージがL1キャッシュにない場合は、オンラインでフェッチされます。イメージをオンラインで取得すると、ディスクキャッシュに保存されますが、VolleyはURL(およびURLのみ)をキーとして保存します。

これが期待どおりの動作ですか?何か不足していますか?

+0

あなたの応答のヘッダに依存する可能性があります。 – njzk2

+1

なぜ、ボレーはヒットしないのですか? – iamrelos

+0

[droidQuery](http://bit.ly/droidquery)を使用して、非同期の快適なリクエスト(Ajax)を完了し、キャッシュの管理を容易にすることができます(キャッシュされたオブジェクトを保持するかどうか、および保持する期間)。 – Phil

答えて

-1

これは正確な動作方法です。

  1. そのURLにアクセスし、利用できないときに画像を取得します。
  2. 可能であれば、キャッシュからイメージをロードします。
+0

これは意味をなさない。まず、あなたがURLをヒットする前に、キャッシュからイメージをロードしたい。第二に、これは私の質問に答えていませんどのようにボレーworkks – Markus

+0

私はあなたが上記のコメントで述べたように働くかのようにあなたの質問を理解した。 –

+0

あなたの言っていることを理解できません。私は「内部のボレーキャッシュが決してヒットしないのはなぜですか? – Markus

1

ImageCacheを実装するクラスを投稿できますか?

私はちょうどこれを見ていて、ディスクから読み込んだときにメモリキャッシュにビットマップを追加していないので、毎回ディスクから読み込みます。

これは私が何を意味するかの簡単な例であると私は間違って

@Override 
    public Bitmap getBitmap(String cachKey) { 

     Bitmap b = null; 

      //check the memory first 
      b = memoryCache.get(cacheKey); 
      if(b == null){ 
       //memory cache was null, check file cache   
       b = diskLruImageCache.getBitmap(cacheKey); 

       // this is where it needs to be added to your memory cache 
       if(b != null){ 
        memoryCache.put(url, b); 
       } 
      } 



     return b; 
    } 
9

ディスクキャッシュのためのバレーボールのデフォルトの動作は、HTTPに依存しているので、あなたが任意のヒットを取得していない理由があるつもりでした要求している要素のヘッダー(あなたの場合は、画像)。

バレーボールが動作する方法は次のとおりです。

  1. ImageLoader小切手画像のためのL1キャッシュ(そのコンストラクタでImageLoaderにあなたが提供するメモリキャッシュ)。利用可能な場合は、画像を返す。
  2. 処理依頼はRequestQueueです。イメージのL2(ディスクキャッシュ)をチェックします。
  3. ディスクキャッシュに見つかった場合は、イメージの有効期限を確認してください。有効期限が切れていない場合は、戻ります。
  4. イメージをダウンロードして返します。
  5. イメージをキャッシュに保存します。

デフォルト設定が仕事をしたい場合は、画像は疑問符がそれをダウンロードした時点から十分な秒を示すmax-age=???ようCache-Controlヘッダを持っている必要があります。

デフォルトの動作を変更する場合はわかりませんが、コードを少し編集する必要があります。

VolleyソースのCacheDispatcherクラスを見てください。

1

私は今日この問題を自分のアプリで追跡しました。私はコンストラクタで最大キャッシュサイズをKB単位で設定していましたが、sizeOf()でバイト単位のサイズを報告していたので、何もキャッシュされませんでした。

This answer私はまっすぐに設定しました。

0

応答ヘッダーにキャッシュ制御が設定されていない場合、Volleyは何もキャッシュしません。

VolleyのHttpHeaderParserクラスの実装を確認してください。

キャッシングは、max-ageタグまたはE-tagに基づくことができます。レスポンスヘッダーを確認し、そこに設定されているものを特定します。それはこのようなものに見えます。

のCache-Control→公開、最大エージング= 300

Cache Header info

1

おそらくあなたは、あなたのイメージをロードするためにNetworkImageViewを使用しています。あなたはImageViewとImageLoaderを使って同じことをすることができます。 ImageLoaderを使用すると、キーのメタデータはどのイメージサイズでも "#W0#H0"のようになります。

ImageLoader imageLoader = getImageLoader(); 
imageLoader.get(url, ImageLoader.getImageListener(imageView, defaultDrawable, errorDrawable)); 
関連する問題