8

私には、メモリが漏れていることを誓っているアクティビティがあります。私が取り組んでいるアプリは画像がたくさんあるので、ビットマップを使って直接作業するときにはかなり記憶に執着しなければなりませんでした。私はアクティビティを追加しました。この新しいアクティビティを使用すると、基本的にmemの使用法が私を悩ませてしまい、 "Bitmap exceed VM budget"例外が発生します。このアクティビティを起動しないと、以前と同じようにすべてがスムーズです。Android - 画像リソースの背景を使用して動的にUIを構築するとメモリリークが発生する

私はメモリリークについて読んで始めました。私はAndroidのドキュメントの記事で説明されているのと同様の状況があると思います。私は、動的にたくさんのイメージビューを作成し、リソースからBackgroundDrawableを追加して、OnClickListenerも追加しています。アクティビティがライフサイクルでonPauseに当たったときにクリーンアップをしなければならないと思っていますが、何が正しいのかを具体的に知りたいと思います。ここで

は、私はこれは少し奇妙に聞こえるために起こっているが、私は上の任意のビットマップの操作をしたアプリケーションとのトラブルがあった...

LinearLayout templateContainer; 
    . 
    . 
    . 
    ImageView imgTemplatePreview = (ImageView) item.findViewById(R.id.imgTemplatePreview); 
    . 
    . 
    . 
    imgTemplatePreview.setBackgroundDrawable(getResources().getDrawable(previewId)); 
    imgTemplatePreview.setOnClickListener(imgClick); 
    templateContainer.addView(item); 
+0

このトピックに関する他の情報はありませんでしたか?私はボタンをクリックした後に画像を反転する単一のビューで作業しています。アプリケーションを複数回再起動すると、unbind()メソッドが使用され、ビットマップサイズのためにOOMが残っているため、超過... –

+0

うん...これは7ヶ月前に投稿されました。私はビットマップ、メモリ、OOMエラーなどについて理解していました。私のメールで私のプロフィールを見つけてください。私は喜んでコメントしています。糸。要するに、私が実際に限界を押しているときには、私のビットマップを管理するクラス(いくつかのケースでは、複数のクラス)を作成し、使用したらすべてのビットマップをリサイクルします。これは、あなたのアクティビティに単一のBitmapを保持し、それを新しいインスタンスに置き換える前に.recycleを呼び出すだけの単純なものになります。必要に応じて私を見つけてください。もっと議論して嬉しいです。 – Rich

+0

こんにちは、私たちはすべて忙しいと分かり、知識を共有するのに時間がかかりますが、私もまだ2ヶ月目ですが、この7ヶ月間に何を集めているかについて、それは再発する質問のように本当に人気のある記事になります。私は優れたRomainの記事を読んだが、それはビットマップを扱うときにリークを引き起こす原因を知る必要があることを示唆しているに過ぎないようだ...リークを引き起こす.recycleとonClickコールバックはそこには言及されていなかった。 &大衆が見逃しているトリック。ありがとう、 – sradforth

答えて

0

で働いているオブジェクトを示すべきコードでありますアクティビティのハンドラに関連付けられているスレッド以外のスレッド。特に、私は、java.util.Timerスレッドでイメージ操作を行うことによって、多くのメモリをリークしていたアプリケーションを持っていました。そのコードをHandler.postDelayedを使用して移行すると、メモリの問題が解決されました。

+0

私はあなたのことを聞いていますが、問題は高水準のAndroidビューオブジェクトを使用してメモリ使用量を最大限にし、そこに漏れないようにするための行に沿っています。私はすでにうまく動作している画像操作コードの山があります。一度に読み込むことのできる限界には限界がありますが、通常の作業環境では、十分に調整しても問題ありません。私が上記のものを紹介するとすぐに... BOOM! – Rich

+0

残念ながら、私は同情以外のものはあまりないと思います。私は非常に複雑なUIを持つ2つのアプリケーションを開発しました。ある時点で、BitmapFactoryが処理できるものの限界に突き当たりました。 1つのアプリケーションでは、私のアプリのためにいくつかのページ設定をすることに頼らざるをえなくてはならず、別のやり方では、グラフィック要素の束のサイズを小さくしなければならなかった。 – jjb

2

リッチ、

あなたは彼らが必要とされていないとき、あなたが積極的にそれらをクリーンアップする必要があり、多くのBitmap Sに対処しようとしている場合は、(は良いスタートです)。

私は以前、約ImageViewについてのディスカッションを覚えていて、表示されたビットマップへの長引いた参照を奇妙な挙動で覚えています。私が思い出したことは、レイアウトを維持しながら漏れたくない場合は、ImageViewから現在のコンテキストへの参照をすべて削除する必要があることです。 onClickリスナーとビットマップを削除します。積極的にメモリを解放したい場合は、Bitmap.recycle()に電話してください。コンテキストまたは内部クラスへの参照が残っている静的フィールドがないことを確認してください。

Androidのランチャー用のコードも、これらのことのいくつかを行う際には参考にしています。 OpenSourceはあなたの友人です。

EDIT

見つかったRomain Guysの記事。 (unbindDrawables()メソッドを探し

この例では、コンテキストを漏洩する最も簡単な例一つであり、あなたは私たちがホーム画面のソースコードで、その周りに働いていた方法を見ることができますがBasicly彼は道のこの部分に言及します)アクティビティが破棄されたときに、格納されたドロウアブルのコールバックをnullに設定することによって、

は今、私はメモリ使用量(まだ)のこのタイプを管理しなければならなかったことがありませんので、ここから、私は詳細についてはThe Home Screen Sourceを見てお勧めします。 unbind()メソッドが行620に表示される

+0

それで、それはまさに私の質問です。 setBackgroundDrawableとOnClickListenerを介して背景をsetOnClickListener経由で追加する場合、これらのリソースをクリーンアップする適切な方法は何ですか。私はそれらをきれいにする必要があるという概念を理解しています。私のコードでインスタンス化する明示的なビットマップはすべて既にクリーンアップされています。問題は、ビューの派生UI要素に添付されたものを適切にクリーンアップする方法です。 – Rich

+0

@Richこの回答を書いているうちに私が考えていた記事が見つかりました。そのロマンガイ(GoogleのAndroidエンジニア)ので、いくつかの本当に良いもの。 http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/ – smith324

+0

あまりにも怠け者のために全部を読むのは私の編集を見てください。 – smith324

関連する問題