7

Universal Image Loader を Android アプリに統合しようとしています。GridView があり、インターネットから取得した画像を表示します。通常の方法で getView() に画像をロードする ArrayAdapter を使用して実装しました。

画像を正しく表示するという点ではうまく機能します。しかし、メモリ キャッシュから画像を読み込む際に予期しない動作が発生することがわかりました。

  1. アクティビティが開始されると、UIL はインターネットまたはディスク キャッシュ (存在する場合) から画像を読み込みます。(もちろん、期待通りの動作です。)
  2. 最初の列が画面から消えるまで GridView を下にスクロールし、スクロールして一番上に戻ります。このとき、最初の列の画像は、メモリ キャッシュではなく、ディスク キャッシュから読み込まれます。
  3. 次に、上下にスクロールします。このとき、最初の列の画像がメモリ キャッシュから読み込まれます。

上記の操作のステップ 2 である、2 回目の表示時に画像がメモリ キャッシュから読み込まれることを期待しています。この場合、ディスクキャッシュが使用される理由がわかりません。

これが私のコードです。

ImageLoaderConfiguration

ImageLoaderConfiguration mImageLoaderConfig =
        new ImageLoaderConfiguration.Builder(getApplicationContext())
                .defaultDisplayImageOptions(defaultOptions)
                .enableLogging()
                .build();

表示画像オプション

DisplayImageOptions defaultOptions =
        new DisplayImageOptions.Builder()
                .cacheInMemory()
                .cacheOnDisc()
                .showImageForEmptyUri(R.drawable.empty_photo)
                .showStubImage(R.drawable.empty_photo)
                .displayer(new FadeInBitmapDisplayer(500))
                .build();

ArrayAdapter の getView()

if (convertView == null) {
    convertView = (FrameLayout) LayoutInflater.from(getContext())
            .inflate(mLayoutId, null);
    convertView.setLayoutParams(mImageViewLayoutParams);
} else { // Otherwise re-use the converted view
    convertView.findViewById(R.id.videoIconInThumbnail).setVisibility(View.GONE);
}

// Check the height matches our calculated column width
if (convertView.getLayoutParams().height != mItemHeight) {
    convertView.setLayoutParams(mImageViewLayoutParams);
}

ImageView image = (ImageView) convertView.findViewById(R.id.photoThumbnail);
ImageLoader.getInstance().displayImage(thumbnailUrl, image,
        new SimpleImageLoadingListener() {

            @Override
            public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                Log.v(TAG, imageUri + " is loaded.");
            }
        });
return convertView;

GridView の要素のレイアウト XML

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/photoThumbnail"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop" >
    </ImageView>

    <ImageView
        android:id="@+id/videoIconInThumbnail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:src="@drawable/ic_play"
        android:visibility="gone" >
    </ImageView>
</FrameLayout>

UIL のバージョンは 1.8.4 です。テスト済みの Android バージョンは 4.1.2 です。

上記操作で画像を3回読み込んだ際のUILのログ出力を追加しました。

// Fist time of displaying
I/ImageLoader( 7404): Start display image task [http://xxx/yyy.JPG_1080x1776]
I/ImageLoader( 7404): Load image from disc cache [http://xxx/yyy.JPG_1080x1776]
I/ImageLoader( 7404): Subsample original image (x192) to x192 (scale = 1) [http://xxx/yyy.JPG_1080x1776]
I/ImageLoader( 7404): Cache image in memory [http://xxx/yyy.JPG_1080x1776]
I/ImageLoader( 7404): Display image in ImageView [http://xxx/yyy.JPG_1080x1776]

// Second time of displaying
I/ImageLoader( 7404): ImageLoader is paused. Waiting...  [http://xxx/yyy.JPG_358x357]
I/ImageLoader( 7404): Start display image task [http://xxx/yyy.JPG_358x357]
I/ImageLoader( 7404): Load image from disc cache [http://xxx/yyy.JPG_358x357]
I/ImageLoader( 7404): Subsample original image (x192) to x192 (scale = 1) [http://xxx/yyy.JPG_358x357]
I/ImageLoader( 7404): Cache image in memory [http://xxx/yyy.JPG_358x357]
I/ImageLoader( 7404): Display image in ImageView [http://xxx/yyy.JPG_358x357]

// Third time of displaying
I/ImageLoader( 7404): Load image from memory cache [http://xxx/yyy.JPG_358x357]

ありがとうございました。

4

2 に答える 2

0

NOSTRAの答えは正しいです。これを回避するには(2回目に画像をリクエストするときにディスクキャッシュからロードします)、画像をデコードする前にUILにImageViewの幅/高さを知らせることができます.ImageViewに「android:maxWidth android:maxHeight」を追加するだけです

于 2016-06-22T03:24:40.853 に答える