SharedPreference注册OnSharedPreferenceChangeListener一直无法回调问题
注册代码如下:
1 SharedPreferences sp = getSharedPreferences("AndroidDemo", Context.MODE_PRIVATE); 2 sp.registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener() { 3 @Override 4 public void onSharedPreferenceChanged(SharedPreferences arg0, String arg1) { 5 } 6 });
无法回调主要是因为注册的监听器使用了匿名内部类,由于SharedPreferences保持在WeakHashMap中,这意味着你不能监听一个匿名内部类,因为它会成为垃圾收集的目标,只要你离开目前的范围,它将会被垃圾收集,从WeakHashMap中删除并停止工作。
应该使用当前类作为监听器,即在当前类中实现SharedPreferences.OnSharedPreferenceChangeListener接口,只要当前类的实例没有被回收,就可以保证回调的有效性。
所以注册此监听时,最好不要使用匿名内部类,否则会由于垃圾回收机制导致此监听无效,而无法回调。