Android で匿名内部クラスを使用しても安全なのはどのような場合ですか?
Nov 09, 2024 pm 09:32 PMAndroid で匿名の内部クラスを安全に使用できる場合
内部クラスのメモリ リーク
Android では、内部クラスが外部クラスよりも存続するときにメモリ リークが発生します。これは、内部クラスが外部クラスへの強い参照を直接または別のオブジェクトを通じて間接的に保持している場合に発生する可能性があります。
匿名内部クラスを使用する安全な状況
使用アクティビティ内の匿名内部クラスは、一般に次の場合に安全です。
- 匿名クラスは、アクティビティの最終メンバーまたは静的メンバーにのみアクセスする必要があります。アクティビティ。
- 匿名クラスは、クリック リスナーなどの有効期間の短いコールバックです。
- 匿名クラスは、定義されているのと同じメソッド内で使用されます。
- 外部クラスは、静的内部クラスまたは匿名内部クラスのサブクラスです。
Safe の例匿名内部クラス
質問で提供したコード サンプルは、安全な匿名内部クラスの例です。
// This is safe because the anonymous class is a short-lived callback okButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { dialog.dismiss(); } });
匿名内部クラスを使用する危険な状況
アクティビティ内で匿名の内部クラスを使用すると危険な可能性がありますwhen:
- 匿名クラスは、アクティビティまたはそのコンテキストへの長期参照を保持します。
- 匿名クラスは、外部クラスのメソッドをオーバーライドします。
- 匿名クラスは外部クラス内の複数の場所で使用されています。
危険な匿名内部クラスの例クラス
次のコード サンプルは、危険な匿名内部クラスを示しています。
// This is dangerous because _droidPlayRunnable holds a long-lived reference to _someFieldOfTheActivity _handlerToDelayDroidMove = new Handler(); _handlerToDelayDroidMove.postDelayed(_droidPlayRunnable, 10000); private Runnable _droidPlayRunnable = new Runnable() { public void run() { _someFieldOfTheActivity.performLongCalculation(); } };
アクティビティのライフサイクルと内部クラスについて
Android アクティビティいつ作成、再開、一時停止、破棄されるかを決定するライフサイクルがあります。アクティビティが破棄されると、その内部状態は失われます。これには、アクティビティ内の内部クラスへの参照が含まれます。
メモリ リークからの保護
匿名の内部クラスでのメモリ リークを回避するには、次のことが重要です。
- 必要な場合にのみ匿名内部クラスを使用してください。
- 匿名内部クラスが解放されていることを確認してください外部クラスへの参照が必要なくなったら、それらの参照を削除します。
- 可能であれば、匿名の内部クラスではなく、静的にネストされたクラスを使用することを検討してください。
- 外部クラスの onDestroy() メソッドをオーバーライドして解放します。匿名内部クラスへの参照。
以上がAndroid で匿名内部クラスを使用しても安全なのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

人気の記事

人気の記事

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











2025年のトップ4 JavaScriptフレームワーク:React、Angular、Vue、Svelte

Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか?

高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか?

キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか?

Spring Boot Snakeyaml 2.0 CVE-2022-1471問題修正
