onSharedPreferenceChanged вызывает переполнение стека на некоторых устройствах Android - PullRequest
5 голосов
/ 18 февраля 2012

Я только что выпустил свои первые живые обои для 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();
}
}

1 Ответ

3 голосов
/ 20 февраля 2012

Хорошо, я понял это.Было просто отменить регистрацию слушателя перед вызовом Editor.commit (), а затем снова зарегистрировать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...