5

遅延読み込みに関するいくつかの投稿を確認しましたが、私の問題は少し異なっていると思います。

私はギャラリーを持っています(私のクラスはGalleryを拡張しています)。20個のかなり大きなサイズの画像(それぞれ400〜500K)を表示します。OutOfMemory例外が発生したため、それらすべてをギャラリーにロードできません。
そこで、20個のDrawableの配列を作成し、最初に最初の9個の要素(画像はWebから取得)にデータを入力し、残りはすべてnullに設定しました。私の意図はこれでした:右にフリングで、要素番号をフェッチします。10およびnull要素番号に設定します。0.右側のフェッチ要素番号への別のフリング。11そしてnull要素番号に設定します。1からnull。左フリングの同じロジック。

問題は、要素がフェッチされるよりもはるかに速く飛ぶことができるということです。私のギャラリーにはBaseAdapterがあり、そのgetView()は次のようになります。

public View getView(int position、View convertView、ViewGroup parent){
     ImageView imageView = new ImageView();
     imageView.setDrawable(imageArray [position];
     ...。
     ...。

     imageViewを返します。
}

getView()を確認するにはどうすればよいですか?imageArray [position]がまだnullの場合は、「loading ...」ダイアログを表示し、設定したら同じ位置で繰り返しますか?
imageViewを空にして、その場で設定したくありません。設定するまでimageViewをまったく見られないようにしたい。

ありがとう。

4

1 に答える 1

6

ギャラリーはスムーズな体験のために設計されています。画面をブロックし、フェッチされるまで次の画像に切り替えないと、UIが非常に悪くなります。このように、ユーザーはまったく逃げることができなくなります。読み込み中は、画像の代わりに読み込みインジケーターを表示する必要があります。

あなたのシナリオはかなり一般的だと思います。画像をダウンロードして表示する必要があります。OutOfMemoryを取得した場合は、画像をビットマップオブジェクトにロードしているときに、メモリ不足の問題をスーパーサンプリングすることができます。

OutOfMemoryがまだある場合は、メモリからビットマップを削除してSDにキャッシュする必要があります。そのため、ユーザーが戻ってきたときにSDから画像を再度読み込むことができれば、十分に高速になります。また、メモリ消費量が少なくなります。ご提案のとおり、最新の10枚の画像をメモリにキャッシュし、その他の画像をSDにキャッシュすることができます。

ListViewでの画像の遅延読み込みのサンプルコードをご覧ください。実際にはListViewアダプターですが、わずかな変更を加えてギャラリーに適用できます。私はそれがあなたが必要とすることを正確に行うと思います。

于 2010-07-05T23:39:53.597 に答える