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

DDD
リリース: 2024-11-09 21:32:02
オリジナル
827 人が閲覧しました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート