7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

OnSharedPreferenceChangeListener が動かない!何で?というときは無名関数になってないかを疑う

Posted at

OnSharedPreferenceChangeListener が最初は呼ばれるんだけどしばらくすると呼ばれなくなるよ

現象

SharedPreference の更新時に自動的に何かの処理をするとき SharedPreferences#registerOnSharedPreferenceChangeListener 使ってリスナー登録する。でも、しばらくすると「リスナーが呼ばれてないんだけど」という現象が起こる。例えばこんなコード。

// prefs は SharedPreference
prefs.registerOnSharedPreferenceChangeListener(
  new SharedPreferences.OnSharedPreferenceChangeListener() {
  public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
    // TODO なんか実装
  }
});

理由

これだと、GC 対象になってリスナーが知らないうちに消えてるから注意!

解決方法

  1. 無名関数はやめよう
  2. 普通にリスナーをインスタンス化したものを registerOnSharedPreferenceChangeListener しよう
// インスタンス化したものを用意、 listener が参照を保持してれば GC されない
listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
  public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
    // TODO なんか実装
  }
};
// ここで登録する
prefs.registerOnSharedPreferenceChangeListener(listener);

■おわり ak

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?