あなたのメモリリークの原因に関するあなたの見解はあまり正しくありません。
ビュー要素への参照の格納は、これを行う方法とメモリリークの原因となる可能性があります。たとえば、静的参照を使用しないでください。たとえば、ビットマップイメージを静的に参照すると、誤ってガベージコレクションの問題が発生する可能性があります。
次のようにしてください。
class{
private TextView myTextView;
onCreate()
myTextView = findViewById(R.id.mytextview);
myMethod()
myTextView.text = "hello view."
}
MyMethodはの便宜のために純粋に既存の参照を使用して、あなたが参照の多くを持っていた場合、本当に読めないコードのためになるだろうしかし
findViewById(R.id.mytextview).text = "hello view";
を入れてからあなたを止めるものは何もありません。したがって、ローカルスコープ変数を使用する可能性があります。
myMethod()
TextView myTextView = findViewById(R.id.mytextview);
myTextView.text = "Hello"
.....
あなたの個人的な好みに応じて、必ずしもメモリリークが発生することはありません。
ここで問題となるのは、findViewByIdは集中的なプロシージャなので、実際に繰り返し呼び出すことは望ましくありません。リストビューは特にこの傾向があり、これに対応していないと大幅に減速します。
したがって、リストビューでは、人々がviewHolderパターンを実装していることがわかります。ビューの子要素への参照を割り当てる小さなオブジェクトです。このオブジェクトは親ビューのTagプロパティに割り当てられます。 ViewタグのプロパティにviewHolderがあるかどうかを確認するためにテストするビューの後続の呼び出しでは、ビューの内容を更新する必要があるたびにfindViewByIdを呼び出す時間と労力を節約する子オブジェクトへの参照があります。
非常に大まかなアイデアは、わずかに異なります。 viewHolder = new ViewHolder(); viewHolder.myTextField = findViewById(R.id.mytextview); myView.setTag(viewHolder) .... (viewHolder) viewHolder.text = "こんにちは" あなただけのリストビューでこれを使用することになり
注意ください。私はそれを一般的な経験則として使っていません。
リストビューアダプタの効率的なビューホルダーパターンをルックアップします。
画像への静的参照は、自らが何らかの形でアクティビティに明らかに束縛されているため、特に問題となります。したがって、ビットマップオブジェクトへの静的な参照は、アクティビティが決して解放されないことを意味します。 – Emile
うん、誰か混乱している人のために私の元の答えは静的なビットマップを使っていましたが、ImageViewを参照するだけで後でインスタンス化したアクティビティのコンテキストを参照しています。 – Simon