0

テキストと画像を表示するリストビューを使用しています。Task オブジェクトを使用して画像を非同期にダウンロードし、それらをビューにロードしてリストビューを効率的にスクロールしようとしています。しかし、ビットマップをディスクに保存してアクセスしても、メモリ内にビットマップが多すぎるため、OutOfMemoryExceptions が頻繁に発生します。私が見る理由の 1 つは、作成されるタスクが多数あり (20 個の画像の場合、20 個のタスクが作成される)、メモリを占有する可能性があることです。これを行う効率的な方法はありますか?

ここにコードがあります

4

2 に答える 2

1

ビットマップがフル解像度でメモリにロードされないように、ビットマップをスケーリングする必要があります。アルファ、レッド、グリーン、ブルーのすべてのカラー値を保持するには、ピクセルあたり 4 バイトを割り当てる必要があるため、サイズが 100kb のビットマップはメモリ内で 400kb になります。画像をカメラで撮影すると、サイズが簡単に 10 倍になり、すぐに大量のメモリが消費されます。

画像を拡大縮小しているのがわかりますDecodeSampledBitmapが、不要になったときに破棄する必要もあります。

SetBitmapビットマップを破棄するのを忘れた場合は、次のステートメントを簡単に配置できますusing

using(var bitmap = ImageDownloader.DownloadImage( url, width, height ))
{
    if( !token.IsCancellationRequested )
        (this.m_context as Activity).RunOnUiThread(
                () => imageView.SetImageBitmap( bitmap )
            );
}

Xamarin ドキュメントのLoad Large Bitmaps Efficiently 記事もご覧ください。

于 2013-03-04T08:23:22.767 に答える
0

ビットマップを効率的にロードすることに加えて、後でイメージをリリースできることを Android に認識させることも重要であることを最近発見しました。

利用可能なデコード オプションの 1 つがあり、InPurgeableこれを に設定することtrueは、ロードされたビットマップを Android でメモリからクリアしたい場合に重要です。

これが true に設定されている場合、結果のビットマップは、システムがメモリを再利用する必要がある場合にパージできるようにピクセルを割り当てます。その場合、ピクセルに再びアクセスする必要がある場合 (たとえば、ビットマップが描画され、getPixels() が呼び出される)、それらは自動的に再デコードされます。

見る:

于 2013-03-05T07:39:55.963 に答える