2011-08-25 61 views
3

我有一個preferenceActivity實現OnSharedPreferenceChangeListener,我已經實現了onSharedPreferenceChanged方法。我使用關鍵字「this」在onResume和onPause()中註冊和取消註冊一個監聽器。正在實施OnSharedPreferenceChangeListener不良做法?

目前爲止所有的工作都很好,但我擔心我的聽衆會被垃圾收集,如in this post所述。我做錯了什麼?似乎太簡單了,但如果它沒有損壞,我不想修復它!

我的活動

public class MyPreferences extends PreferenceActivity implements 
     OnSharedPreferenceChangeListener { 
    //blah blah blah 
} 

我onSharedPreferenceChangeListener

@Override 
public void onSharedPreferenceChanged(SharedPreferences sp, String key) { 
    doMyStuff(); 
} //onSharedPreferenceChanged 

的onResume()&的onPause()

@Override  
protected void onResume() { 
    super.onResume(); 
    getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);  
} //end onResume 

@Override  
protected void onPause() {   
    super.onPause(); 
    getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); 
} //end onPause 

回答

0

我不認爲這會是一個問題,因爲類本身就是偵聽器,將只被銷燬,結束後收集的()垃圾已被調用。

0

此鏈接您發佈的每個活動恢復

時間創建一個實例因此,如何保持基準

OnSharedPreferenceChangeListener myPrefListner = new OnSharedPreferenceChangeListener(){ 
     public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 
     // your stuff 
     } 
} 

,並在您的onResume和的onPause

@Override  
protected void onResume() { 
    super.onResume();   
    getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(myPrefListner);  
} 



@Override  
protected void onPause() {   
    super.onPause();   
    getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(myPrefListner); 

} 

這將非常類似於你正在做的事情,除非我們保持一個堅實的參考。

+0

看來,onPause()和onResume()之間的任何首選項更改通知都不會被對象接收,因爲首選項活動將在此時間範圍內運行。這會導致您的應用錯過更改通知。 – Califf

+0

Wow 4 years ...,OP在偏好活動中實現了聽衆。如果我被迫從外面改變同樣的偏好,我會在那裏處理它。 – Samuel