OnSharedPreferenceChangeListener が最初は呼ばれるんだけどしばらくすると呼ばれなくなるよ
現象
SharedPreference の更新時に自動的に何かの処理をするとき SharedPreferences#registerOnSharedPreferenceChangeListener 使ってリスナー登録する。でも、しばらくすると「リスナーが呼ばれてないんだけど」という現象が起こる。例えばこんなコード。
// prefs は SharedPreference
prefs.registerOnSharedPreferenceChangeListener(
new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
// TODO なんか実装
}
});
理由
これだと、GC 対象になってリスナーが知らないうちに消えてるから注意!
解決方法
- 無名関数はやめよう
- 普通にリスナーをインスタンス化したものを registerOnSharedPreferenceChangeListener しよう
// インスタンス化したものを用意、 listener が参照を保持してれば GC されない
listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
// TODO なんか実装
}
};
// ここで登録する
prefs.registerOnSharedPreferenceChangeListener(listener);
■おわり ak