onSharedPreferenceChanged正在某些Android设备上导致堆栈溢出

onSharedPreferenceChanged正在某些Android设备上导致堆栈溢出,android,recursion,overflow,sharedpreferences,Android,Recursion,Overflow,Sharedpreferences,我刚刚发布了我的第一张android实时壁纸。我在我的手机和几个朋友的手机上进行了bug测试,没有发现任何问题,但在某些设备上,它显然陷入了递归循环,当用户试图更改设置时,会导致堆栈溢出错误 我相信问题的出现是因为我有某些“主题”设置,需要更改其他几个持久值。例如,一个主题将设置默认的颜色、速度、背景等。似乎当我使用Editor.commit()以编程方式持久化这些值时,它会一次又一次地调用SharedPreferenceChanged 由于这是一张实时壁纸,我在透明的首选项屏幕后面有一个预览,

我刚刚发布了我的第一张android实时壁纸。我在我的手机和几个朋友的手机上进行了bug测试,没有发现任何问题,但在某些设备上,它显然陷入了递归循环,当用户试图更改设置时,会导致堆栈溢出错误

我相信问题的出现是因为我有某些“主题”设置,需要更改其他几个持久值。例如,一个主题将设置默认的颜色、速度、背景等。似乎当我使用Editor.commit()以编程方式持久化这些值时,它会一次又一次地调用SharedPreferenceChanged

由于这是一张实时壁纸,我在透明的首选项屏幕后面有一个预览,我需要它来反映设置的更改。我还需要滑块/颜色选择器/列表首选项来反映用户直接进行的更改,以及在选择“主题”时以编程方式进行的更改。要做到这一点,最简单的方法似乎是使用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()之前注销侦听器,然后在调用之后再次注册即可。

您能举个例子吗?