onSharedPreferenceChanged正在某些Android设备上导致堆栈溢出
我刚刚发布了我的第一张android实时壁纸。我在我的手机和几个朋友的手机上进行了bug测试,没有发现任何问题,但在某些设备上,它显然陷入了递归循环,当用户试图更改设置时,会导致堆栈溢出错误 我相信问题的出现是因为我有某些“主题”设置,需要更改其他几个持久值。例如,一个主题将设置默认的颜色、速度、背景等。似乎当我使用Editor.commit()以编程方式持久化这些值时,它会一次又一次地调用SharedPreferenceChanged 由于这是一张实时壁纸,我在透明的首选项屏幕后面有一个预览,我需要它来反映设置的更改。我还需要滑块/颜色选择器/列表首选项来反映用户直接进行的更改,以及在选择“主题”时以编程方式进行的更改。要做到这一点,最简单的方法似乎是使用onSharedPreferenceChanged中的首选项编辑器来更改它们,事实上,这在许多设备上都有效 我能做些什么使它在所有设备上都工作 以下是相关代码:onSharedPreferenceChanged正在某些Android设备上导致堆栈溢出,android,recursion,overflow,sharedpreferences,Android,Recursion,Overflow,Sharedpreferences,我刚刚发布了我的第一张android实时壁纸。我在我的手机和几个朋友的手机上进行了bug测试,没有发现任何问题,但在某些设备上,它显然陷入了递归循环,当用户试图更改设置时,会导致堆栈溢出错误 我相信问题的出现是因为我有某些“主题”设置,需要更改其他几个持久值。例如,一个主题将设置默认的颜色、速度、背景等。似乎当我使用Editor.commit()以编程方式持久化这些值时,它会一次又一次地调用SharedPreferenceChanged 由于这是一张实时壁纸,我在透明的首选项屏幕后面有一个预览,
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()之前注销侦听器,然后在调用之后再次注册即可。您能举个例子吗?