2011-11-10 7 views
1

私はAndroidアプリケーションで潜在的なメモリリークを追跡していますが、私は何をすべきか分かりません。まず、私がしようとしていることを説明します。ギャラリー内のListViewを使用したAndroidのメモリリーク

私はEclair(APIレベル7)とHTC Incredible running Gingerbread(2.3.7、APIレベル10)でテストしています。 LogCatを観察すると、アプリケーションの最大ヒープサイズは約32MBであると仮定します。

私は連絡先のいくつかのページを持っているアドレス帳を構築しようとしています。左右にスクロールしてページ間を移動し、上下にスクロールして現在のページをナビゲートします。これを達成するために、私はGalleryを使用しています。そのアダプターは連絡先リストをListViewに適合させています。アダプターのアダプターは、1つの連絡先をRelativeLayoutに順応させます。

すべてが正常に動作しているようですが、ネイティブ(外部)メモリが不足していますギャラリーをスワイプするとすぐにがスワイプします。私はしばらくの間Galleryの周りをスワイプした後にHPROFダンプを作り、それをMATに引っ張った。ヒストグラムでは、自分の連絡先RelativeLayoutが数百あって、私の連絡先ListViewでのみ保持されていました。ここで私はそのListViewの[切り捨て] MAT merge_shortest_paths出力を見たときに私が見つけたものです:

android.view.ViewRoot$1 
+ this$0 android.view.ViewRoot 
    + mAttachInfo android.view.View$AttachInfo 
    + mScrollContainers java.util.ArrayList 
     + array java.lang.Object[303] 
     + [110], [112], [114], [116], [118], ... com.example.LeakyListView 
     + ...and so forth. 

これら漏れたListViewの上に保持する唯一のものは、このandroid.view.View$AttachInfo年代mScrollContainersフィールドでした。問題は、最初に私の意見がどのようにそこに入っているのかわからないので、私はこの漏れを塞ぐ方法を失いました。

どのようにこのメモリリークを解決できますか?少なくとも、このリファレンスチェーンはどのように構築され、ViewRootAttachInfo、およびmScrollContainersは何ですか?

簡単なテストケースに分けてすぐにコードを投稿してみますが、これで会話を開始するには十分だと思っています。

+0

uが私にあなたが使用している画像の最大サイズを伝えることができますか? –

+0

各連絡先の画像は32x32です。私のサンプルデータでは、各 "ページ"には10の連絡先があり、7ページあります。私は[Fedorのlazylist](https://github.com/thest1/LazyList)に似たImageLoaderを使用しています。ソースイメージはそれぞれ約37x37です。 –

+0

これとまったく同じ問題が発生しています。 –

答えて

3

あなたは本当に、本当にこの種のもののために代わりにギャラリーのViewPagerを使用する必要があります。http://android-developers.blogspot.com/2011/08/horizontal-view-swiping-with-viewpager.html

+0

私は 'ViewPager'にショットを与えるつもりです。これはまさに私がこの機能を実装し始めたときに探していたものです。なぜこの漏れが 'Gallery'と' ListView'をこのように使うことに内在する問題であるのか説明できますか? –

+0

私は 'ViewPager'を使用して切り替えましたが、漏れはすべて消えましたが消えました。私はまだ別のページ間ですばやくスワイプするときにいくつかの問題を抱えていますが、これは 'ViewPager'の欠点ではなく、イメージをロードする方法であると思われます。ヘッドアップをありがとう!とにかく、 'Gallery'を使ってハックのように感じました。 –

+0

ギャラリーはListViewのようなスクロール可能なものを保持することを意図したものではありません。 – hackbod

関連する問題