0

アクティビティ A内で、 sharedPrefsという名前のSharedPreferencesインスタンスを取得し、その上でregisterOnSharedPreferenceChangeListener(myListener)メソッドを呼び出して、myListener という名前のOnSharedPreferenceChangeListenerオブジェクトを渡し、 sharedPrefsがリンクされている設定の変更に反応するとします。

私の質問は次のとおりです。sharedPrefsがスコープ外になった場合、つまり、破棄/ガベージ コレクションされた場合でも myListener の onSharedPreferenceChanged メソッドが呼び出されますかそれともActivity Aインスタンス変数でsharedPrefsが指すオブジェクトへの参照を保存する必要がありますか?アクティビティ A のライフサイクル全体で、変更された設定のイベントを確実に受け取ることができますか?

4

2 に答える 2

0

インスタンスには 1 つの登録済みリスナーがあるため、2 つのオブジェクトはガベージ コレクションされず、リスナーが呼び出されます。

于 2012-05-22T18:48:53.477 に答える
0

私の質問への答えは次のようになると思います: はい、接続されているSharedPreferencesインスタンスがガベージコレクションされると、OnSharedPreferenceChangeListenerは停止します(つまり、もう呼び出されません) または同様のメソッド) はスコープ外になります。そのメソッドはsingletonを返すためです。つまり、返されたオブジェクトへの静的参照がどこかに格納されており、オブジェクトを存続させます。そのため、 getSharedPreferencesによって返されたオブジェクトの格納について心配する必要はありません(ただし、 getSharedPreferencesを再度呼び出すことは避けることができます)。)、そのメソッドは常に同じオブジェクトへの参照を返すためです。心配する必要がある唯一のことは、unregisterOnSharedPreferenceChangeListener で登録を解除する必要があるときに、registerOnSharedPreferenceChangeListener に渡す OnSharedPreferenceChangeListener オブジェクトへの参照を保存することです(ここは、register メソッドに渡したのと同じインスタンスを渡す必要があります。未登録ではありません)。私を正しい方向に向けてくれた ChristopheCVB に感謝します。

于 2012-05-28T06:15:48.707 に答える