SD カードから画像を読み込んで全画面モードで表示しているときにメモリ不足エラーが発生したため、Universal Image Loader を備えた ViewPager をギャラリーのようなインターフェイスの代替として使用できるかどうか、または使用する必要があるかどうかはよくわかりません。数に関係なく、GridView では問題なく動作しますが、ビュー ページャーで画像を表示している間、各ビットマップは大量のメモリを消費し続け、10 個ほどの画像の後、メモリ不足エラーが発生します。
Universal Image Loader での作業中にメモリ不足エラーに関連してここに投稿されたほとんどすべての質問を見てきましたが、それぞれの質問で、原因として構成エラーがありました。
間違った構成を使用しているのか、それとも何を使用しているのかはわかりませんが、多くの時間を無駄にしてしまい、行き詰まっています。ヘルプ/アドバイスをいただければ幸いです。
ImageLoader の構成:
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
.memoryCache(new WeakMemoryCache())
.denyCacheImageMultipleSizesInMemory()
.discCacheFileNameGenerator(new Md5FileNameGenerator())
.imageDownloader(new ExtendedImageDownloader(getApplicationContext()))
.tasksProcessingOrder(QueueProcessingType.LIFO)
// .enableLogging() // Not necessary in common
.build();
表示画像オプションは次のとおりです。
options = new DisplayImageOptions.Builder()
.showImageForEmptyUri(R.drawable.image_for_empty_url)
.resetViewBeforeLoading()
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
.bitmapConfig(Bitmap.Config.RGB_565)
.displayer(new FadeInBitmapDisplayer(300))
.build();
ライブラリで提供されたサンプル プロジェクトを使用していますが、これらの設定も機能せず、しばらくするとクラッシュします。私の推測では、表示されていないビューからビットマップをリサイクルする必要がある特定のコールバックがあると思います。
編集:メモリリークであることはわかっています。表示されていないビューは、本来あるべきときに破棄されますが、メモリは解放されません。これは destroyItem コールバックの実装で、さまざまな質問に示されているヒントに従いましたが、メモリ リークはまだ見つかりません。
@Override
public void destroyItem(View container, int position, Object object) {
// ((ViewPager) container).removeView((View) object);
Log.d("DESTROY", "destroying view at position " + position);
View view = (View)object;
((ViewPager) container).removeView(view);
view = null;
}