Adapterクラスで画像を表示したらOutOfMemoryが起こった際に

上記で悩みがあったので自分的メモです。

一般的にadapterでは

Adapter#getViewの挙動について

というようにして再利用と書いてあるんだけど、イマイチ意味を理解していなかったのだけど、

画像を表示してみたら、メモリの容量が小さい端末で落ちるようになったんです。

nexus oneですが。どうにも落ちるので、galaxy sでは落ちなかったのだけど、System.gc()を大量に設置しても落ちたので、本格的なメモリリークであると判断しました。

※個人的にSystem.gc()で解決すれば、負荷が高かっただけだと認識です。

 

で、調べてみたら上記の記事にぶちあったったわけです。で各convertViewにはgetViewで

convertView = _layoutInflater.inflate(R.layout.postedinflate, null);

というような仕様にしていたんですよ。で、このとき設置したレイ・アウトの中に画像を設置していたんですが、この設置した画像の参照が残るみたいだったんですね。

正直、removeViewみたいなクラスがあるわけではないので、参照を外すのはできないと思ったのですが、

 

12345

23456

に表示が変更された時1で利用されていたconvertViewが6で再利用されるらしい。

との事で、

if(convertView == null){
            convertView = _layoutInflater.inflate(R.layout.postedinflate, null);
        }

で再利用するconvertViewはっていうのが取得できるのがわかったんですよ。

今までここでconvertViewを再利用しないで、判定せずに最初からinflateをしていたので、上書きみたいな事になっていたのだけど、inflate上書きだと参照が取れないみたいで上記みたいに、再利用の時はそのまま利用してImageViewを上書きという風にすれば、outofmemoryがでなくなりました。

 

少し面倒くさいような感じですが、お困りであればお試しください。

 

前後の記事

前の記事:

次の記事:

関連の記事

コメントの投稿

  • サイト内検索

新作アプリの紹介

関連サイトの紹介

アンドロイドアプリ開発TIPS
きぐるみカメラ
ふらいぱん
アンドロイドのデザイン集
Page top↑