onSharedPreferenceChanged вызывает переполнение стека на некоторых устройствах Android

Я только что выпустил свои первые живые обои для 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();
}
}
5
задан Ryan 17 February 2012 в 23:46
поделиться