2013-03-24 64 views
5

設計問題基本上 - 有一個PreferenceActivity應該讓它實現OnSharedPreferenceChangeListener還是應該在另一個類中定義這個功能 - 比如在內部類中?有沒有什麼理由比其他方法更喜歡那個?Android:應該在哪裏定義/註冊OnSharedPreferenceChangeListener

還應該在哪裏註冊監聽器?我的意思是the docs和常識決定在onResume/onPause分別註冊/取消註冊,但看到azillionregistrationsonCreate我只是想知道我是否失去了一些東西。

另外我不太確定如果註銷失敗(因此here例如註銷可能不會被調用,因爲onStop不保證被調用)必然會導致泄漏。所以,如果我有例如

class MyPref extends PreferenceActivity implements 
      OnSharedPreferenceChangeListener { 
    SharedPreferences sharedPreferences; 
    // init sharedPreferences 
    onStart(){ 
     sharedPreferences.registerOnSharedPreferenceChangeListener(this); 
    } 
    // no unregistration 
} 

這會泄露MyPref實例一旦我回到我的其他活動?

最後 - 對OnPreferenceChangeListener也適用同樣的考慮嗎?

編輯:回到我看不到註冊OnPreferenceChangeListener - 我是盲目的嗎?

回答

1

我不認爲除了個人喜好之外,還有什麼主要的理由來支持聆聽者的特定位置。讓Activity實現它,或者使用一個內部類 - 無論是匿名的 - 都可以。

唯一的問題是,如果您不使用像Activity這樣的現有對象作爲偵聽器,則需要保留對偵聽器對象的引用。根據this answer它會收集垃圾(因此實際上沒有聽任何東西),如果你沒有。


已經挖成源的一下,似乎SharedPreferencesImpl使用WeakHashMap包含註冊的偵聽器(source,線72-73,186-196),這意味着無法註銷不會事業泄漏。

如您所說,文檔確實建議使用onResume()/onPause();這可能與泄漏無關,但是爲了防止後臺應用程序進行不必要的處理 - 所以仍然值得關注!

0

在/onResume做註冊和取消註冊是很多額外的工作。

你可以做一個匿名實現你的聽衆爲你這樣的類的一部分:

[class level] 
... 
OnSharedPreferenceChangeListener mListener = new OnSharedPreferenceChangeListener() { 
    onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
     // your code here 
    } 
}; 
... 
[class level] 

然後將其設置(如適用)。如果你這樣做,你的偵聽器將不會被重新創建爲/onResume之間的一個不同的對象(除非你的應用程序被殺死,並且你的Activity子類必須再次加載),所以分配它是毫無意義的,因爲你會始終引用同一個對象。另一方面,如果你的應用程序確實被殺死了,那麼onCreate將再次被調用。由於代碼更加清潔,我傾向於使用匿名實現(如上所示) - 我不必費心使用類名,並且不得不爲了實現一個內部類而不得不使用類名,並且不得不爲輸入較少的括號。然而,這真的是一個偏好的事情,所以做你覺得更好的事情。

+1

_Doing registration and de-registration_ - why?是不是需要註銷聽衆?我問的是什麼泄漏? – 2013-03-25 01:10:53

+0

您不需要取消註冊。如果系統決定殺死該應用程序,系統將簡單地殺死它。此外,每個應用程序都運行在它自己的VM實例中,也會被殺死,因此您不必註銷任何內容,也不會發生任何泄漏 - 當進程終止時,所有內存都將被釋放(內核將處理該問題) 。這就是爲什麼建議您將數據保存到'onPause'或'onStop'中的永久存儲器。但是,這不會發生在'onPause'和'onResume'之間。 – Shade 2013-03-25 01:14:51

+0

@Mr_and_Mrs_D,你發現這個問題有更好的答案嗎?如果是這樣,爲什麼不爲所有人的利益回答呢? – Shade 2013-03-30 22:58:15

相關問題