ホームページ > Java > &#&チュートリアル > Android アクティビティで内部クラスを使用するときにメモリ リークを防ぐにはどうすればよいですか?

Android アクティビティで内部クラスを使用するときにメモリ リークを防ぐにはどうすればよいですか?

DDD
リリース: 2024-11-09 17:43:02
オリジナル
963 人が閲覧しました

How Can I Prevent Memory Leaks When Using Inner Classes in Android Activities?

アクティビティ内での内部クラスの安全な使用:

内部クラスの有効期間がコンテナ クラス (アクティビティ) の有効期間を超えると、メモリ リークのリスクが生じる可能性があります。 )Androidでは。これは、外部クラスが破棄または再作成された後で、外部インスタンスが内部インスタンスを参照する場合に発生する可能性があります。

例 1 (安全):

この例では、匿名内部クラスはメソッドのスコープ内で定義されており、アクティビティへの長期間有効な参照を維持しません。したがって、リークセーフです:

final Dialog dialog = new Dialog(this);
// ...
dialog.show();
ログイン後にコピー

例 2 (危険):

この例では、Handler で実行される Runnable に匿名の内部クラスを使用します。 Runnable はアクティビティのフィールドを参照するため、アクティビティよりも存続し、その参照が維持され、メモリ リークが発生する可能性があります:

_handlerToDelayDroidMove = new Handler();
_handlerToDelayDroidMove.postDelayed(_droidPlayRunnable, 10000);
// ...
private Runnable _droidPlayRunnable = new Runnable() { 
    public void run() {
        _someFieldOfTheActivity.performLongCalculation();
    }
};
ログイン後にコピー

いつ内部クラスが外部クラスよりも存続できるのか?

以下の場合、内部クラスは外部クラスよりも存続する可能性があります。

  • 内部クラスが外部オブジェクトまたはコンポーネントによって参照され、外部インスタンスを間接的に存続させます。
  • 内部クラスは、外側のクラスの外側で宣言され、外側のクラスを手動で参照します。
  • アプリケーションのライフサイクルの変更 (画面の回転など) は、内側のクラスはそのままにして、外側のクラスを破棄します。

アクティビティとビューのリーク:

  • アクティビティは、すべてのビューへの長期参照を保持します。
  • ビューまたはアクティビティ内の内部クラスはアクティビティを保持できます。または、破棄または再作成された後でも、インスタンスを生きた状態で表示します。
  • この種のリークを回避するには、参照を慎重に管理し、可能な限り静的な内部クラスまたはファクトリ メソッドを使用する必要があります。

実行可能リーク:

  • 実行可能クラスは、アクティビティまたはビュー インスタンスを参照できる匿名の内部クラスを使用して実装される可能性があります。
  • このリスクを軽減するには、静的クラスの使用を検討してください。代わりに Runnables または AsyncTask を使用します。これらはデフォルトで VM によって管理されます。

ベスト プラクティス:

  • アクティビティまたはビュー インスタンスへの参照を保存しないようにします。存続期間の長いオブジェクト。
  • 静的内部クラスまたはファクトリ メソッドを使用して、外側のクラス メンバーへのアクセスが必要な内部クラスを作成します。
  • Activity インスタンスまたは View インスタンスを参照する Runnable の匿名内部クラスは避けてください。
  • アクティビティの存続期間を超えて存続する必要がある参照には、アクティビティ コンテキストの代わりにアプリケーション コンテキストを使用します。

以上がAndroid アクティビティで内部クラスを使用するときにメモリ リークを防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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