注冊代碼如下:
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接口,只要當前類的實例沒有被回收,就可以保證回調的有效性。
所以注冊此監聽時,最好不要使用匿名內部類,否則會由於垃圾回收機制導致此監聽無效,而無法回調。