ホームページ Java &#&チュートリアル Android で匿名内部クラスを使用しても安全なのはどのような場合ですか?

Android で匿名内部クラスを使用しても安全なのはどのような場合ですか?

Nov 09, 2024 pm 09:32 PM

When is it Safe to Use Anonymous Inner Classes in Android?

Android で匿名の内部クラスを安全に使用できる場合

内部クラスのメモリ リーク

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 サイトの他の関連記事を参照してください。

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

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

2025年のトップ4 JavaScriptフレームワーク:React、Angular、Vue、Svelte 2025年のトップ4 JavaScriptフレームワーク:React、Angular、Vue、Svelte Mar 07, 2025 pm 06:09 PM

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

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

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

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

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

node.js 20:キーパフォーマンスが向上し、新機能 node.js 20:キーパフォーマンスが向上し、新機能 Mar 07, 2025 pm 06:12 PM

node.js 20:キーパフォーマンスが向上し、新機能

Iceberg:データレイクテーブルの未来 Iceberg:データレイクテーブルの未来 Mar 07, 2025 pm 06:31 PM

Iceberg:データレイクテーブルの未来

Javaで機能的なプログラミング技術を実装するにはどうすればよいですか? Javaで機能的なプログラミング技術を実装するにはどうすればよいですか? Mar 11, 2025 pm 05:51 PM

Javaで機能的なプログラミング技術を実装するにはどうすればよいですか?

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

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

Spring Boot Snakeyaml 2.0 CVE-2022-1471問題修正 Spring Boot Snakeyaml 2.0 CVE-2022-1471問題修正 Mar 07, 2025 pm 05:52 PM

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

See all articles