首页 > 代码库 > SharedPreference注册OnSharedPreferenceChangeListener一直无法回调问题

SharedPreference注册OnSharedPreferenceChangeListener一直无法回调问题

注册代码如下:

1 SharedPreferences sp = getSharedPreferences("AndroidDemo", Context.MODE_PRIVATE);2 sp.registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener() {3     @Override4     public void onSharedPreferenceChanged(SharedPreferences arg0, String arg1) {5     }6 });
 

无法回调主要是因为注册的监听器使用了匿名内部类,由于SharedPreferences保持在WeakHashMap中,这意味着你不能监听一个匿名内部类,因为它会成为垃圾收集的目标,只要你离开目前的范围,它将会被垃圾收集,从WeakHashMap中删除并停止工作。

应该使用当前类作为监听器,即在当前类中实现SharedPreferences.OnSharedPreferenceChangeListener接口,只要当前类的实例没有被回收,就可以保证回调的有效性。

所以注册此监听时,最好不要使用匿名内部类,否则会由于垃圾回收机制导致此监听无效,而无法回调。