gpt4 book ai didi

android - SharedPreferences.onSharedPreferenceChangeListener 没有被一致地调用

转载 作者:IT老高 更新时间:2023-10-28 12:51:19 31 4
gpt4 key购买 nike

我正在注册一个这样的偏好更改监听器(在我的主要 Activity 的 onCreate() 中):

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);

prefs.registerOnSharedPreferenceChangeListener(
new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(
SharedPreferences prefs, String key) {

System.out.println(key);
}
});

问题是,监听器并不总是被调用。它适用于首选项更改的前几次,然后在我卸载并重新安装应用程序之前不再调用它。重新启动应用程序似乎无法修复它。

我找到了一个邮件列表 thread报告同样的问题,但没有人真正回答他。我做错了什么?

最佳答案

这是一个偷偷摸摸的。 SharedPreferences 将监听器保存在 WeakHashMap 中。这意味着您不能将匿名内部类用作监听器,因为一旦您离开当前范围,它将成为垃圾收集的目标。它一开始会工作,但最终会被垃圾收集,从 WeakHashMap 中删除并停止工作。

在你的类的一个字段中保留对监听器的引用,只要你的类实例没有被破坏,你就可以了。

即而不是:

prefs.registerOnSharedPreferenceChangeListener(
new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
// Implementation
}
});

这样做:

// Use instance field for listener
// It will not be gc'd as long as this instance is kept referenced
listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
// Implementation
}
};

prefs.registerOnSharedPreferenceChangeListener(listener);

在 onDestroy 方法中取消注册可以解决问题的原因是,您必须将监听器保存在字段中,从而防止出现问题。将监听器保存在解决问题的字段中,而不是在 onDestroy 中取消注册。

更新:Android 文档为 updatedwarnings关于这种行为。所以,古怪的行为仍然存在。但现在已经记录在案了。

关于android - SharedPreferences.onSharedPreferenceChangeListener 没有被一致地调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2542938/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com