6

多くの(リモート)画像を含むリストビューを表示しようとしています。私はその仕事にボレーを使おうとしています。

ボレーはある程度機能しますが、十分ではありません。ImageLoader.get volley には、次のコードがあります。

    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 のみ) をキーとして保存します。

これは予想される動作ですか?何か不足していますか?

4

6 に答える 6

9

ヒットが得られない理由は、ディスク キャッシングに対する Volley のデフォルトの動作が、要求している要素 (この場合は画像) の HTTP ヘッダーに依存しているためです。

ボレーの仕組みは次のとおりです。

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

デフォルト設定を機能させたい場合、画像には、ダウンロードされてから十分な秒数を示すクエスチョン マークのCache-Controlようなヘッダーが 必要です。max-age=???

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

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

于 2013-07-31T13:32:15.893 に答える
1

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

ImageLoader imageLoader = getImageLoader();
imageLoader.get(url, ImageLoader.getImageListener(imageView, defaultDrawable, errorDrawable));
于 2015-08-25T20:25:56.633 に答える
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;
    }
于 2013-07-23T14:43:07.023 に答える
-1

これはまさにあなたがそれを機能させたい方法です。

  1. 利用できない場合は、URL にアクセスして画像を取得します。
  2. 利用可能な場合は、キャッシュから画像を読み込みます。
于 2013-07-15T07:16:23.997 に答える