0

假設活動內的我得到一個SharedPreferences實例調用sharedPrefs,然後我調用registerOnSharedPreferenceChangeListener(myListener的)方法在其上傳遞稱爲myListener的一個OnSharedPreferenceChangeListener對象向改變到反應鏈接sharedPrefs的偏好設置。OnSharedPreferenceChangeListener是否與它所註冊的SharedPreference實例一起死亡?

我的問題是:是onSharedPreferenceChanged myListener的援引即使sharedPrefs失控的範圍,即是破壞/垃圾收集,或做我需要保存一個參考對象指出的方法通過sharedPrefs活動A實例變量,以確保所有的Actvity一個生命週期過程中,我會收到改變首選項事件?

+0

你有挑撥嗎?通過創建2個SharePreference實例? – ChristopheCVB

+0

不,我只要我可以試試,在此期間我在這裏問,看看是否有人給我一個答案,也許這比*有關對象的範圍和生命的Android相關的*問題更加Java的。 –

回答

0

由於實例有一個註冊監聽器,這兩個對象不會被垃圾收集和聽衆將被調用。

+0

好的,那麼我還有另一個問題。如果我想取消註冊偵聽器,如果我沒有對* sharedPrefs *的引用,該怎麼做?如果它如你所說的那樣工作,我不能在* SharedPreferences *的另一個實例上調用* unregisterOnSharedPreferenceChangeListener *,比如說* sharedPrefs2 *,對不對?我會爲此發佈另一個問題。 –

+0

對,沒關係...... – ChristopheCVB

+0

你的意思是說我說的是正確的,或者我可以調用*取消註冊... *在不同於* register的實例* *上? –

0

我認爲,回答我的問題可能是:是的,OnSharedPreferenceChangeListener模具(即不再被調用)當SharedPreferences實例,它連接是收集垃圾,但它不會發生只要getSharedPreferences(或類似的方法)獲得的引用超出範圍,因爲該方法返回一個單例,也就是說存在對返回對象的靜態引用,存儲在某處,這將保持對象活着。所以你不必擔心存儲由getSharedPreferences返回的對象(儘管你可以避開再次調用getSharedPreferences),因爲該方法總是返回同一個對象的引用。你需要擔心的唯一的事情是存儲於你傳遞給registerOnSharedPreferenceChangeListener的時間OnSharedPreferenceChangeListener對象的引用,當您需要註銷他們unregisterOnSharedPreferenceChangeListener(在這裏你需要傳遞您通過相同情況下,到寄存器方法,否則它們不未登記)。 感謝ChristopheCVB指出我正確的方向。

+0

另請參閱:http://stackoverflow.com/q/2542938/281545 –