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