さまざまな Android アプリケーションの場合、大きなListView
s、つまり 100 ~ 300 エントリのビューが必要です。
アプリケーションの起動時にすべてのエントリを一括でロードする必要があります。ソートと処理が必要であり、アプリケーションは最初に表示する項目を認識できないためです。
これまでのところ、すべてのアイテムの画像も一括で読み込んでおり、ArrayList<CustomType>
各エントリの残りのデータと一緒に保存されています。
ただし、もちろん、これは良い方法ではありません。次のような問題が発生する可能性が非常に高いためOutOfMemoryException
ですArrayList
。
したがって、最善の解決策は、明らかに、テキスト データのみを一括で読み込み、必要に応じて画像を読み込むことですよね? たとえば、Google Play アプリケーションでは次のように処理されます。スクロールすると画像が読み込まれることがわかります。つまり、おそらくアダプタのgetView()
メソッドで読み込まれます。しかし、Google Play の場合、画像はインターネットからロードする必要があるため、これは別の問題ですが、私には当てはまりません。私の問題は、画像の読み込みに時間がかかりすぎることではありませんが、画像を保存するにはメモリが多すぎることです。
では、画像はどうすればよいのでしょうか。getView()
本当に必要なときにロードしますか? スクロールが遅くなります。それで、それから電話しAsyncTask
ますか?それとも普通のThread
?パラメータ化しますか?
既にロードされているイメージを に保存できるHashMap<String,Bitmap>
ので、 に再度ロードする必要はありませんgetView()
。しかし、これを行うと、メモリの問題が再び発生します。HashMap
ストアはすべての画像への参照を格納するため、最終的には再び問題が発生する可能性がありますOutOfMemoryException
。
ここには、画像の「遅延読み込み」について議論する質問がすでにたくさんあることを知っています。しかし、それらは主に読み込みが遅いという問題をカバーしており、メモリ消費量が多すぎません。
編集: getView() で AsyncTasksを開始することにしました。これにより、画像がバックグラウンドで ListView に読み込まれます。しかし、これによりアプリケーションが RejectedExecutionException に遭遇します。私は今どうすればいい?