Является ли реализация OnSharedPreferenceChangeListener плохой практикой? - PullRequest
3 голосов
/ 25 августа 2011

У меня есть preferenceActivity, которое реализует OnSharedPreferenceChangeListener, и я реализовал метод onSharedPreferenceChanged. Я регистрирую и отменяю регистрацию слушателя в onResume и onPause (), используя ключевое слово "this"

Пока все работает хорошо, но я обеспокоен тем, что мой слушатель будет собирать мусор, как описано в этом посте . Что я делаю плохую практику? Кажется слишком легким, но если он не сломан, я не хочу это исправлять!

Моя деятельность

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

Ответы [ 2 ]

0 голосов
/ 25 августа 2011

эта ссылка, которую вы разместили, создает экземпляр каждый раз, когда действие возобновляется

так как насчет сохранения ссылки

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 голосов
/ 25 августа 2011

Я не думаю, что это будет проблемой, так как сам класс является слушателем, и будет уничтожен, а сборщик мусора будет вызван только после того, как будет вызвана finish ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...