1

問題のあるオブジェクト(コンテキスト、ビューなど)への直接/間接参照を持たないクラスのインスタンスへの参照があるとします。この参照を静的参照で使用する場合と、クラスを拡張するクラス内で使用する場合に違いはありますApplicationか?

つまり、両方の方法で、プロセスが強制終了された場合 (またはプロセスへの参照がない場合) にのみ、参照されたオブジェクトが解放されますよね? 複数のプロセスを使用する場合、違いがあるのでしょうか?

4

2 に答える 2

1

わずかな違いの 1 つは、静的参照とクラス内参照のどちらかを選択する状況にある場合、激しいメモリ不足の場合に(または) にGarbage Collectorバインドされた静的参照を が最初に破棄することです。この状況が発生するのは、(または) が破棄されると、静的変数が参照なしのままになるため (上記以外の参照がない場合)、GC によって収集できるためです。VM が(または) を再初期化したとしても、それらの静的参照は初期値を取得し、発生した可能性のある更新は失われます。一般的な経験則として、静的変数が永続的であることを確認したい場合:ActivitiesServicesApplicationActivityServiceActivityService

  1. Activities(または) から参照しないでくださいServices。メモリ不足で破壊される可能性があります。
  2. アクティビティまたはサービスからそれらを参照しますが、非静的参照の場合と同様に、それらが手動で (たとえば、onSavedInsanceStateAndroid のメソッドを使用して) 破棄される状況を処理します。

編集これがなぜ起こっているのかについての説明は次のとおりです。

静的参照は、それらを最初に初期化したクラスのクラス ローダーにバインドされます。これは、任意のクラス内の静的変数がアクティビティによって初期化されている場合、そのアクティビティが破棄されると、そのクラスもアンロードされる可能性があるため、変数が初期化されないことを意味します。変数がアプリケーション クラスによって初期化されている場合、その寿命はアプリケーション プロセスと同じであるため、再度初期化されなくなることはないと確信しています。そのため、MyApplication クラスですべてのシングルトンを初期化することにしました。

このリンクにあります。

于 2012-07-12T07:26:43.250 に答える