SharePreference 注册 registerOnSharedPreferenceChangeListener 无法回调的问题
2017-03-16 12:48
375 查看
以前一直没有用过 registerOnSharedPreferenceChangeListener 回调方法,今天用到了,就设置了下,结果发现不起作用,因为一直没有回调。
代码:
然后就搜索和看源码,已经有人提出了这个问题及解决办法,因为 SharedPreferences 的实现类 SharedPreferencesImpl 中对于观察者模式的储存使用的是 WeakHashMap ,所以当储存的 key 没有使用的时候就会回收掉,而上面的代码中使用的是匿名内部类,所以就容易被 GC 掉。
源码:
解决办法:
不使用匿名内部类,同时在 onStart() 中注册,在 onStop() 中取消注册。
代码:
mSp = this.getSharedPreferences(HuaweiPushReceiver.SP_Name, MODE_PRIVATE); mSp.registerOnSharedPreferenceChangeListener(new SharedPreferences.OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { String token = sharedPreferences.getString(HuaweiPushReceiver.SP_KEY, null); tv.setText("sp token:" + token); Log.d(TAG, "sp token:" + token); } });
然后就搜索和看源码,已经有人提出了这个问题及解决办法,因为 SharedPreferences 的实现类 SharedPreferencesImpl 中对于观察者模式的储存使用的是 WeakHashMap ,所以当储存的 key 没有使用的时候就会回收掉,而上面的代码中使用的是匿名内部类,所以就容易被 GC 掉。
源码:
private final WeakHashMap<OnSharedPreferenceChangeListener, Object> mListeners = new WeakHashMap<OnSharedPreferenceChangeListener, Object>(); SharedPreferencesImpl(File file, int mode) { mFile = file; mBackupFile = makeBackupFile(file); mMode = mode; mLoaded = false; mMap = null; startLoadFromDisk(); } ... public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) { synchronized(this) { mListeners.put(listener, mContent); } }
解决办法:
不使用匿名内部类,同时在 onStart() 中注册,在 onStop() 中取消注册。
SharedPreferences mSp; SharedPreferences.OnSharedPreferenceChangeListener mListener = new SharedPreferences .OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { String token = sharedPreferences.getString(HuaweiPushReceiver.SP_KEY, null); tv.setText("sp token:" + token); Log.d(TAG, "sp token:" + token); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ... mSp = this.getSharedPreferences(HuaweiPushReceiver.SP_Name, MODE_PRIVATE); } ... } @Override protected void onStart() { super.onStart(); mClient.connect(); mSp.registerOnSharedPreferenceChangeListener(mListener); } @Override protected void onStop() { mSp.unregisterOnSharedPreferenceChangeListener(mListener); super.onStop(); }
相关文章推荐
- Oracle Sys用户用默认密码change_on_install 无法登录的问题(错误代码:ORA-28009)
- android 4.4 动态注册+静态注册电话短信广播后收到两次onReceive回调的问题
- 解决JQuery中input的change(onchange)无法触发的问题
- CompoundButton(checkbox,switch,ToggleButton)和RadioGroup OnCheckedChangeListener() 引用冲突问题
- OnPreferenceChangeListener与OnPreferenceClickListener的分析
- 关于startActivityForResult跳转页面返回时onActivityResult回调无法执行的问题
- OnPreferenceChangeListener,OnPreferenceClickListener
- SharedPreferences.OnSharedPreferenceChangeListener
- OnPreferenceChangeListener分析,以及与OnPreferenceClickListener的区别
- Oracle Sys用户用默认密码change_on_install 无法登录的问题(错误代码:ORA-28009)
- RadioButton.check(ChildId()),后执行3次OnCheckedChangeListener的问题
- SharedPreferences.OnSharedPreferenceChangeListener什么时候调用
- RegisterStartupScript或RegisterClientScriptBlock注册js脚本而无法执行的问题分析
- onActivityResult无法回调的问题
- MFC使用CEF并实现js与C++交互功能,解决Render进程中OnContextCreated绑定与OnWebKitInitialized的js扩展无法回调问题
- RadioGroup调用check(id)方法时,OnCheckedChangedListener被多次回调问题
- 【起航计划 031】2015 起航计划 Android APIDemo的魔鬼步伐 30 App->Preferences->Advanced preferences 自定义preference OnPreferenceChangeListener
- Android 百度地图开发-setOnTouchListener方法给mapView设置了OnTouchListener后地图无法拖动的问题
- OnPreferenceChangeListener和OnPreferenceClickListener分析
- 调用SharedPreferenceChangeListener