メモリ リークの原因に関するあなたの観察は、まったく正しくありません。
ビュー要素への参照を保存することはまったく問題ありません。これを行う方法とそれらを使用すると、メモリリークが発生する可能性があります。たとえば、静的参照の使用は避けてください。たとえば、ビットマップ イメージを静的に参照すると、サイモンが回答で指摘したように、ガベージ コレクションの問題が発生する可能性があります。
したがって、次のようにしても問題ありません。
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 プロパティに割り当てられます。その後のビューへの呼び出し中に、ビュー タグ プロパティに viewHolder があるかどうかをテストします。含まれている場合は、子オブジェクトへの参照があるため、ビューの内容を更新する必要があるたびに findViewById を呼び出す時間と労力を節約できます。
非常に大まかなアイデアで、実装が少し異なります。viewHolder = new ViewHolder(); viewHolder.myTextField = findViewById(R.id.mytextview); myView.setTag(viewHolder) .... if (viewHolder) viewHolder.text = "hello"
これはリスト ビューでのみ使用することに注意してください。私はそれを一般的な経験則として使用していません。
リスト ビュー アダプターの効率的なビュー ホルダー パターンを検索します。