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