註冊代碼以下:ide
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中刪除並中止工做。spa
應該使用當前類做爲監聽器,即在當前類中實現SharedPreferences.OnSharedPreferenceChangeListener接口,只要當前類的實例沒有被回收,就能夠保證回調的有效性。code
因此註冊此監聽時,最好不要使用匿名內部類,不然會因爲垃圾回收機制致使此監聽無效,而沒法回調。blog