30

私にはいくつかの不明確な状況があります:

静的シングルトンは、アクティビティを保持している最後の参照が破棄された後にガベージコレクションされますか?アプリケーションにはシングルトンインスタンスへの参照がないためです。その後、シングルトンに頼ることはできますか?

公式のAndroidドキュメントによる:

通常、Applicationをサブクラス化する必要はありません。ほとんどの場合、静的シングルトンは、よりモジュール化された方法で同じ機能を提供できます。

いくつかの投稿によって:

https://web.archive.org/web/20160729201921/http://www.devahead.com/blog/2011/06/extending-the-android-application-class-and-dealing-with-singleton/

アプリケーションの開発中に、アクティビティにバインドされた静的変数の一部が、以前に初期化されていても初期化されていないことがありました。静的変数が初期化されると、アプリケーションの存続期間中はそのままであると思いましたが、そうではないようです。

言い換えると、静的シングルトンクラスへの参照を保持しているものがない場合、ガベージコレクションや破棄を防ぐにはどうすればよいですか?

4

4 に答える 4

19

いいえ、それがシングルトンの場合、そのクラスのフィールドとして格納され、通常、シングルトンはクライアントによって破棄されないためです。つまり、参照を設定staticする静的メソッドを配置しないため、他の誰もそれを使用しない場合は資格がありますガベージコレクション用。静的フィールドの場合、クラスをロードしたクラスローダーが破棄されるとガベージ コレクションが発生します。deleteInstance()null

このため、staticActivity オブジェクトを参照すると、キーワード自体がメモリ リークを引き起こす可能性があるため、使用する際には十分に注意する必要があります。

于 2012-12-15T10:03:02.970 に答える
7

はい。アプリケーションを終了するたびに (たとえば、アプリがカメラ アプリを開いて写真を撮ったり、ブラウザーを開いてリンクを開いたり、ユーザーが [戻る] ボタンを押したりするなど)、Applicationオブジェクトが破棄されて再作成される可能性があります。アプリに戻るとき。

カスタムクラスがある場合はstatic {}カスタムクラスのブロックで静的変数を初期化するか、 nullにならないように初期化する必要があります。ApplicationActivities

この問題は、ハードウェアが弱く、メモリが少ないデバイスで発生する可能性が高くなりますが、どのデバイスでも発生する可能性があることに注意してください。

要点は、Android では、静的変数がいつでもメモリにとどまるとは思わないことです。それらが存在するかどうかを常に確認し、必要に応じて適切な場所で再初期化してください。

編集:

お久しぶりです。このスレッドのことをすっかり忘れていましたが、公式の Android ライフサイクル ドキュメントのソースは次のとおりです。

http://developer.android.com/training/basics/activity-lifecycle/recreating.html

于 2012-12-15T10:02:53.127 に答える
3

Java オブジェクトがガベージ コレクションされる正確な時期を制御することはできません。オブジェクトへの (非循環) 参照がなくなると、オブジェクトはガベージ コレクションの対象になります。さらに、Android では、Activity がいつメモリから削除されるかを制御することはできません。

シングルトンは、常に存在するものを表すことになっています。

  • オブジェクトを強制的にガベージ コレクションすることはできません。ガベージ コレクターを実行するように要求できますがSystem.gc()、それは単なる要求です。

  • 「シングルトン」をガベージ コレクションの対象にする場合は、静的変数を null に設定するメソッドが必要になる可能性があります (参照のコピーが他に取得されていないことを願っています)。明らかに、次に誰かがインスタンスを要求したときに、インスタンスを再作成する必要があります。もちろん、その時点では実際にはシングルトンではありません。

于 2012-12-15T10:07:25.977 に答える
-4

アクティビティが破棄されても、すべてのシングルトン オブジェクトは残ります。

于 2014-12-30T11:37:20.520 に答える