2012-03-16 8 views
1

私はこの昨日の終日と苦労していましたが、まだそれを理解できなかったので、私はその時を考えました。だから私は2つのアクティビティ、1つのタブごとに2つのリストビューをフラグメントとして持つアプリケーションを持っています。アンドロイド(2.3.3/2.2) - 外部割り当て/ GC出力とMAT分析

私は、オープン2つのエミュレータがあります。私は2.3.3エミュレータ上でそれを実行すると、1GBのSDカードと三星銀河

を:64 SDカード

と一つのデバイスで64 SDカード、2.2と2.3.3を: 私は最初のリストに移動し、それを下にスクロールします。すべての行はここで見つけることができますDrawableBackgroundDownloaderクラスを使用して、URLから遅延ロードされた画像があります。そして、私は2番目のリストに移動し、スクロールダウン開始

Lazy load of images in ListView

。 GCはすでに最初のリストに入っていますが、最初の項目が表示された後にエラーが表示されます。

これが出力され、それはエラーを示す開始したとき: enter image description here

「ダウンロード画像は、」画像が述べたクラスのようにスレッドにダウンロードされていることを意味します。

私は、各リストは、約40の項目があり、両方のリストのためのすべてのイメージが完全に

2メガバイト

周りのヒープサイズは同じ〜3.5メガバイトをより少ないまましかし、あなたが見ることができるようにしたことを知っているので、私は画像を管理しています外部のalloc capが10MBから12MBに14244Kb、次に16291Kb、そして18328Kbにジャンプし、突然割り当てに失敗します。

ここで何が起こっているか

これは2.3.3なので、ここではMATを使用してヒープダ​​ンプを分析します。 2.8MBしかありません。私は、ビットマップがヒープ(それへの参照のみ)ではないことを知っているので、そこのリークを分析するのは難しいです。私は2.2のデバイス上でそれを実行すると、とにかくエラー

enter image description here

上のヒープから

ヒストグラム(GCがそう言うと、エミュレータにはOOMEはありません)ヒープではなく、外部メモリを接続しているように見えるdoesntの - それは動作し、同じアクションはGCに外部割り当てが失敗する原因になりません。 は、しかし、正常に終了する第二のリストをスクロールした後、GCからのサンプルは以下のようになります。

03-16 15:30:25.440: D/dalvikvm(19622): GC_EXTERNAL_ALLOC freed 6910 objects/836600 bytes in 40ms 

それはここにオブジェクトとして表現されているのはなぜ? 836600 =〜816kbそれはどういう意味ですか?

2.2エミュレータで実行すると、GCエラーも発生しますが、2.3.3の場合より少し遅れています。 私は、512のエミュレータでsdカードを変更することに違いがないと付け加えます。

イムまだアンドロイド、 に新しい私は、あなたがメモリリークを持っていて、使用していないすべての画像を再利用する必要がある任意のヒントを認めるか、私の推論

答えて

0

でエラーを指摘します。また、それぞれのイメージビューの次元にダウンスケールすることもできます。私はあまりにも長い間、その問題を抱えていました。 X量の画像を効果的に管理する方法。あなたが持っているすべてのビットマップを追跡し、それらがimageViewに割り当てられていることを知ってから、他のすべてのビットマップをリサイクルします。

画像の数とその大きさを知っていれば、任意の時点で50枚の画像などを扱うことができます。

ICS電話機またはハニーコンタブレットに手を入れてください。ビットマップの外部メモリ割り当てはマット内に表示され、どこから漏れているか把握することができます。

0

これはしばらく前に私に推奨されたものでした。決してそれを使用するようになったが、多くの人々がそれを好きだった。 ListViewImageManager