SharedPreference文件变化监听器OnSharedPreferenceChangeListener
来源:互联网 发布:网络机顶盒必装软件 编辑:程序博客网 时间:2024/06/05 10:07
原文:http://www.cnblogs.com/mgstone/p/5802384.html
问题再现
OnSharedPreferenceChangeListener是Android中SharedPreference文件发生变化的监听器。通常我们想要进行监听,会实现如下的代码。
protected void onCreate(Bundle savedInstanceState) { PreferenceManager.getDefaultSharedPreferences(getApplicationContext()) .registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged( SharedPreferences sharedPreferences, String key) { Log.i(LOGTAG, "testOnSharedPreferenceChangedWrong key =" + key); } });}
这种写法看上去没有什么问题,而且很多时候开始几次onSharedPreferenceChanged方法也可以被调用。但是过一段时间(简单demo 不容易出现,但是使用DDMS中的gc会立刻导致接下来的问题),你会发现前面的方法突然不再被调用,进而影响到程序的处理。
原因剖析
简而言之,就是你注册的监听器被移除掉了。首先我们先了解一下registerOnSharedPreferenceChangeListener注册的实现。
private final WeakHashMap<OnSharedPreferenceChangeListener, Object> mListeners = new WeakHashMap<OnSharedPreferenceChangeListener, Object>();//some code goes herepublic void More ...registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) { synchronized(this) { mListeners.put(listener, mContent); }}
从上面的代码可以得知,一个OnSharedPreferenceChangeListener对象实际上是放到了一个WeakHashMap的容 器中,执行完示例中的onCreate方法,这个监听器对象很快就会成为垃圾回收的目标,由于放在WeakHashMap中作为key不会阻止垃圾回收, 所以当监听器对象被回收之后,这个监听器也会从mListeners中移除。所以就造成了onSharedPreferenceChanged不会被调 用。
关于WeakHashMap相关,请阅读 译文:理解Java中的弱引用 进而更多了解。
如何解决
改为对象成员变量(推荐)
将监听器作为Activity的一个成员变量,在Activity的onResume进行注册,在onPause时进行注销。推荐在这两个 Activity生命周期中进行处理,尤其是当SharedPreference值发生变化后,对Activity展示的UI进行处理操作的情况。这种方 法是最推荐的解决方案。
private OnSharedPreferenceChangeListener mListener = new OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged( SharedPreferences sharedPreferences, String key) { Log.i(LOGTAG, "instance variable key=" + key); }};@Overrideprotected void onResume() { PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).registerOnSharedPreferenceChangeListener(mListener); super.onResume();}@Overrideprotected void onPause() { PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).unregisterOnSharedPreferenceChangeListener(mListener); super.onPause();}(后略)
有着梦想,但改变不了世界, 只有坚持,让生活不再单调, 我不是我, 我还是我。
阅读全文
0 0
- SharedPreference文件变化监听器OnSharedPreferenceChangeListener
- SharedPreference文件变化监听器OnSharedPreferenceChangeListener
- SharedPreference注册OnSharedPreferenceChangeListener问题
- SharedPreference注册OnSharedPreferenceChangeListener一直无法回调问题
- Android -eventbus的初步使用 和 OnSharedPreferenceChangeListener (SharedPreference内容改变)监听
- 监听SharedPreference变化的方法
- SharedPreference保存的文件
- Android文件存储--SharedPreference
- android 7.0 databases sharedPreference 存储位置变化
- SharedPreferences.OnSharedPreferenceChangeListener
- view变化监听器ViewTreeObserver介绍
- servlet域属性变化监听器
- view变化监听器ViewTreeObserver介绍
- view变化监听器ViewTreeObserver介绍
- view变化监听器ViewTreeObserver介绍
- view变化监听器ViewTreeObserver介绍
- Android EditText 内容变化监听器
- view变化监听器ViewTreeObserver介绍
- 一只爬虫带你看世界【4】
- 安卓intent调用系统应用,传递数据和接收响应数据
- 如何将PDF文件转换成PPT格式?PDF文件转PPT格式教程分享
- Java Swing编程的时候使用JTable出现ArrayIndexOutOfBoundsException问题
- Arraylist集合三种排序
- SharedPreference文件变化监听器OnSharedPreferenceChangeListener
- 对HTTP协议无状态的理解
- Scrapy
- 【框架】——SSM框架的整合(四)
- 在eclipse中指定使用某个版本的JDK和JRE
- 高精度运算模板
- Windows编程基础--第9节 MFC对话框控件访问的七种方法(下)
- node.js 出现错误代码 Cannot enqueue Handshake after invoking quit
- CodeForces 86C Genetic engineering (AC自动机 上 DP)