ホームページ >Java >&#&チュートリアル >内部クラスは Android 開発におけるメモリ リークにとって本質的に危険ですか?
内部クラスを使用するときは安全ですか?
Android アプリケーションで作業していると、メモリ リークに関連する問題が頻繁に発生します。内部クラスをアクティビティ内で使用すると、潜在的なリスクが生じる可能性があります。しかし、これらのリークは正確にいつ発生するのでしょうか?
内部クラスとメモリ リーク
メモリ リークは、内部クラスがその外部クラス (つまり、アクティビティ) よりも長く存続するときに発生します。 )。この状況は、包含クラスの外側のオブジェクトが内部オブジェクトへの参照を維持し、親クラスがなくなった後もそれを存続させている場合に発生する可能性があります。
例 1: リークのリスクなし
final Dialog dialog = new Dialog(this); dialog.setContentView(R.layout.dialog_generic); Button okButton = (Button) dialog.findViewById(R.id.dialog_button_ok); TextView titleTv = (TextView) dialog.findViewById(R.id.dialog_generic_title); okButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { dialog.dismiss(); } }); titleTv.setText("dialog title"); dialog.show();
この例では、OnClickListener を拡張する匿名クラスはアクティビティを超えて存続しないため、リークのリスクが排除されます。
例 2: 危険の可能性
_handlerToDelayDroidMove = new Handler(); _handlerToDelayDroidMove.postDelayed(_droidPlayRunnable, 10000); private Runnable _droidPlayRunnable = new Runnable() { public void run() { _someFieldOfTheActivity.performLongCalculation(); } };
この例には、内部クラスの一種である匿名 Runnable が含まれています。 Runnable は、それを囲んでいるアクティビティへの暗黙的な参照を保持しているため、アクティビティが破棄された後でも存続する可能性があります。その結果、このコードは危険とみなされ、メモリ リークを引き起こす可能性があります。
内部クラスによるリークからの保護
内部クラスに関係するリークを防ぐには:
アクティビティとビュー
アクティビティはビュー階層への参照を維持するため、メモリ リークが重大な懸念事項になります。アクティビティまたはビューへの参照を持つオブジェクトはそれらを生きたままにし、リークを引き起こす可能性があります。
アクティビティおよびビューのリークを防ぐ
ランナブル
ランナブルは、特に匿名内部クラスとして使用される場合、メモリ リークのもう 1 つの潜在的な原因となります。
ランナブルによるリークの防止
内部クラスが外部クラスよりも存続する場合
これは、外部クラスが内部クラスを作成し、内部クラスが外部クラスへの参照を保存し、事実上存続させている場合に発生する可能性があります。外部クラスが破棄された後でも、内部クラスは参照を通じて引き続きアクセスできます。
結論
アクティビティ内で内部クラスを使用する場合は、メモリ リークを避けるために慎重な考慮が必要です。上記のベスト プラクティスに従うことで、開発者はこれらのリスクを最小限に抑え、Android アプリケーションのスムーズな機能を確保できます。
以上が内部クラスは Android 開発におけるメモリ リークにとって本質的に危険ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。