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()之前取消注册监听器并在之后再次注册它是一件简单的事情。

+0

你能举一些例子吗? – nAkhmedov 2016-02-24 12:03:34