4

問題: 次のように動的に追加する X 個の ImageView があります。

for (int i=2; i < result.size(); i++) {
        // instantiate image view
        ImageView mImageView = new ImageView(this);
        mImageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
        mImageView.setBackgroundResource(R.drawable.selectable_background_theme);
        mImageView.setOnClickListener(this);

        // download image and display it
        mImageLoader.get(result.get(i), ImageLoader.getImageListener(mImageView, R.drawable.ic_logo, R.drawable.ic_action_refresh));

        // add images to container view
        mLlDescContent.addView(mImageView);
    }

画像をクリックして別のアクティビティで全画面表示できるようにしたい。Uri を渡す、または実際のビットマップをバイト配列として渡すなど、いくつかの方法について読みました。

質問: Volley ImageLoader でダウンロードした Uri または実際のビットマップを取得するにはどうすればよいですか。ここで見つけた BitmapLruCache を使用している LruCache: Android Volley ImageLoader - BitmapLruCache parameter? . 誰かが私の目標を達成するために、これまたは任意のアイデアで私を助けることができますか.

上記のコードの後に​​これを試しましたが、何もしませんでした:

Bitmap mBitmap = VolleyInstance.getBitmapLruCache().getBitmap(result.get(2));
mIvAuthorImg.setImageBitmap(mBitmap);

編集:画像を再リクエストする場合:

mImageLoader.get(result.get(i), ImageLoader.getImageListener(mImageView, R.drawable.ic_logo, R.drawable.ic_action_refresh));

画像はキャッシュから読み込まれますが、キャッシュから直接画像にアクセスしようとすると、次のようになります。

Bitmap mBitmap = VolleyInstance.getBitmapLruCache().getBitmap(result.get(2));
mIvAuthorImg.setImageBitmap(mBitmap);

画像が読み込まれません。次のアクティビティに渡す前にサイズを変更するなど、画像を操作できるようにしたいと考えています。

4

2 に答える 2

5

Volley は、効率的なキャッシュを成功させるためにキャッシュの実装に依存します。ビットマップを保存およびロードするための Volley の単純なインターフェイスであるのImageLoaderテイクのコンストラクター。ImageCache

public ImageLoader(RequestQueue queue, ImageCache imageCache)

ImageCacheインターフェイスの Javadoc からの引用:

シンプルなキャッシュ アダプタ インターフェイス。ImageLoader に提供された場合、Volley にディスパッチする前に L1 キャッシュとして使用されます。実装はブロックしてはなりません。LruCache を使用した実装をお勧めします。

ダーウィンドは正しい。画像を要求し、それがキャッシュに存在する場合、Web からではなくキャッシュから読み込まれます。画像を読み込んで表示しているため、これが当てはまるはずです。画像をクリックすると、新しいアクティビティのキャッシュから表示されるはずです。

あなたはそれが機能していないと言います.おそらくあなたの実装はあなたのユースケースに最適化されていません. どのようなキャッシュを使用していますか? Volleyチームが推奨する集中型のものはRequestQueueありますか?ImageLoader

この質問を見てください。これはあなたのものとまったく同じではありませんが、役に立つかもしれません。シンプルな LRU キャッシュの実装があります。

それが役立つことを願っています!

編集:

Volley のポイントは、実装の詳細を気にしないことです。画像が欲しいですか?可能な限り最善かつ最速の方法でロードします(メモリから、ネットワーク経由で存在しない場合)。それはまさにあなたがそれを見るべき方法です。キャッシュを取得してから調べることは、IMO の正しいアプローチではありません。

ここで、ビットマップを操作したい場合は、いくつかのオプションがあります。最適な IMOは、デフォルトのメソッドではなく、独自Image Listenerのメソッドへのパスを実装することです。get()

このようなもの:

public class MyImageListener implements ImageListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        // handle errors
    }

    @Override
    public void onResponse(ImageContainer response, boolean isImmediate) {
        Bitmap bitmap = response.getBitmap();
        if (bitmap != null) {

            //                    
            // manipulations
            //

            // assuming mView is a reference to your ImageView
            mView.setImageBitmap(bitmap);
        } else {
            // display placeholder or whatever you want
        }
    }
}

Javadoc から:

コール フローは次のとおりです。

  1. リクエストにアタッチされると、 onResponse(response, true) が呼び出されて、すでに利用可能なキャッシュされたデータが反映されます。データが利用可能な場合、response.getBitmap() は null 以外になります。

  2. ネットワーク応答が返された後、次のいずれかのケースのみが発生します。

    • 画像が読み込まれた場合、 onResponse(response, false) が呼び出されます。

      また

    • 画像の読み込み中にエラーが発生した場合、onErrorResponse が呼び出されます。

于 2013-07-29T15:19:29.610 に答える
1

現在、キャッシュの有効期限が指定されていない場合 (たとえば、無期限設定の S3 バケットからイメージを取得している場合)、volley にバグがあります (70% バグであると確信しています)。 、常にネットワークから再ダウンロードします。

HttpHeaderParser をチェックアウトし、関連するビットを変更することでこれを回避できます (いずれにせよボレー ソース コードを含める必要があるため、これは完全にクレイジーではありません)。

// Cache-Control takes precedence over an Expires header, even if both exist and Expires
// is more restrictive.
if (hasCacheControl) {
    softExpire = now + maxAge * 1000;
} else if (serverDate > 0 && serverExpires >= serverDate) {
    // Default semantic for Expire header in HTTP specification is softExpire.
    softExpire = now + (serverExpires - serverDate);
} else if (serverExpires == 0) {
    softExpire = Long.MAX_VALUE;
}

次に、パラメータとしてモノを開くアクティビティに Uri を渡すだけです。このソリューションには、アクティビティの起動とビットマップの表示の間に何か問題が発生し、画像に何かが発生した場合でも、画像を再ダウンロードすれば適切に機能するといううらやましい特性があります。それはおそらく決して/めったに起こらないでしょうが、正確さが保たれていることを知ってうれしいです.

于 2013-07-29T18:25:23.867 に答える