onSharedPreferenceChanged在一些Android设备上导致堆栈溢出
问题描述:
我刚刚发布了我的第一个Android动态壁纸。我在我的手机和几个朋友手机上测试了它,但没有发现任何问题,但显然在某些设备上,它陷入了递归循环,并在用户尝试更改设置时导致堆栈溢出错误。onSharedPreferenceChanged在一些Android设备上导致堆栈溢出
我相信问题正在发生,因为我有某些“主题”设置需要更改其他几个持久值。例如,一个主题将设置默认的颜色,速度,背景等等。看起来,当我用Editor.commit()以编程方式持续保存这些值时,它再次调用onSharedPreferenceChanged,并且再一次,并且再次...
既然这是一个动态壁纸,我在透明首选项屏幕后面运行预览,并且我需要它来反映设置更改。我还需要滑块/颜色选择器/列表首选项以反映用户直接进行的更改,并在选择“主题”时以编程方式反映这些更改。最简单的做法似乎是使用onSharedPreferenceChanged中的偏好编辑器来更改它们,事实上,这可以在许多设备上使用。
我能做些什么来使它适用于所有设备?
下面是相关代码:
public void onSharedPreferenceChanged(SharedPreferences prefs, String key)
{
if(key != null)
{
SharedPreferences.Editor editor = prefs.edit();
hue = prefs.getInt("color", 0);
BG_COLOR = prefs.getInt("background_color", 0);
//etc...
if(key.matches("plasma_set"))
{
plasmaAtlasName = atlasName;
editor.putString("atlasName", atlasName);
//load each bolt set with defalut values
if(plasmaAtlasName.equals("plasmaAtlas11"))
{
hue = 180;
editor.putInt("speed", 10);
editor.putInt("bolt_density", 2);
BG_COLOR = 0;
editor.putInt("background_color", BG_COLOR);
editor.putInt("color", hue);
}
if(plasmaAtlasName.equals("plasmaAtlas9"))
{
hue = 330;
editor.putInt("speed", 10);
editor.putInt("bolt_density", 2);
BG_COLOR = 0;
editor.putInt("background_color", BG_COLOR);
editor.putInt("color", hue);
}
//etc...
}
editor.commit();
}
}
答
好吧,我想通了。在调用Editor.commit()之前取消注册监听器并在之后再次注册它是一件简单的事情。
你能举一些例子吗? – nAkhmedov 2016-02-24 12:03:34