ホームページ >Java >&#&チュートリアル >内部クラスは Android 開発におけるメモリ リークにとって本質的に危険ですか?

内部クラスは Android 開発におけるメモリ リークにとって本質的に危険ですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-15 07:10:02713ブラウズ

Are inner classes inherently dangerous for memory leaks in Android development?

内部クラスを使用するときは安全ですか?

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 は、それを囲んでいるアクティビティへの暗黙的な参照を保持しているため、アクティビティが破棄された後でも存続する可能性があります。その結果、このコードは危険とみなされ、メモリ リークを引き起こす可能性があります。

内部クラスによるリークからの保護

内部クラスに関係するリークを防ぐには:

  • 可能な場合は静的内部クラスを使用します。
  • 非静的内部クラスを使用する場合は、その有効期間が外部クラスよりも短いことを確認してください。
  • 次のようなデザイン パターンの使用を検討してください。直接参照を回避するためのファクトリー。

アクティビティとビュー

アクティビティはビュー階層への参照を維持するため、メモリ リークが重大な懸念事項になります。アクティビティまたはビューへの参照を持つオブジェクトはそれらを生きたままにし、リークを引き起こす可能性があります。

アクティビティおよびビューのリークを防ぐ

  • 参照を保持しないようにする
  • 長期間有効なコンテキストが必要な場合は、getApplicationContext() を使用します。
  • 方向変更時のリークのリスクを最小限に抑えるために、構成変更をオーバーライドすることを検討してください。
  • >

ランナブル

ランナブルは、特に匿名内部クラスとして使用される場合、メモリ リークのもう 1 つの潜在的な原因となります。

ランナブルによるリークの防止

  • 匿名ランナブルの代わりに拡張ランナブルを使用します。
  • 可能であれば拡張ランナブルを静的にします。
  • 長期間存続するオブジェクトでは匿名ランナブルを使用しないでください。アクティビティまたはビューへの参照。
  • デフォルトでは VM によって管理されるため、代わりに AsyncTask の使用を検討してください。

内部クラスが外部クラスよりも存続する場合

これは、外部クラスが内部クラスを作成し、内部クラスが外部クラスへの参照を保存し、事実上存続させている場合に発生する可能性があります。外部クラスが破棄された後でも、内部クラスは参照を通じて引き続きアクセスできます。

結論

アクティビティ内で内部クラスを使用する場合は、メモリ リークを避けるために慎重な考慮が必要です。上記のベスト プラクティスに従うことで、開発者はこれらのリスクを最小限に抑え、Android アプリケーションのスムーズな機能を確保できます。

以上が内部クラスは Android 開発におけるメモリ リークにとって本質的に危険ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。