Фиксация редактора SharedPreferences занимает так много времени

Я пытаюсь выполнить настройку с помощью PreferenceActivity...

Я нашел несколько рабочих примеров, таких как

«Редактор расширенной конфигурации WiFi»

и

«Редактор конфигурации Wi-Fi Pro»

но код, который я написал, ждет 10-15 секунд в строке editor.commit()... это должно быть очень просто, но я не могу понять.

вот краткий код;

...

SharedPreferences prefs = PreferenceManager
                .getDefaultSharedPreferences(v.getContext());
prefs.registerOnSharedPreferenceChangeListener(ClassConfig.this);

    SharedPreferences.Editor editor = prefs.edit();
editor.clear();

editor.putString("key1", value1);
editor.putString("key2", value2);
editor.putBoolean("key3", value3);
    ...
    //i got nearly 35 keys here
    ...
    editor.putString("key33", value33);
editor.putBoolean("key34", value34);
editor.putBoolean("key35", value35);

    editor.commit();

Любые идеи??

Обновление: еще одна вещь. Я видел эти предупреждения в файле журнала

W/BackupManagerService(1914) dataChanged, но нет участника pkg='com.android.providers.settings' uid=10046


person caw    schedule 04.02.2011    source источник
comment
Болтовня BackupManagerService не имеет ничего общего с вашей проблемой.   -  person Android Dev Dude    schedule 07.02.2011


Ответы (4)


commit() выполняется синхронно, поэтому вы заметили, что это занимает так много времени. Вместо этого используйте apply().

https://stackoverflow.com/a/5960743/1233659

person Hamzeh Soboh    schedule 01.08.2013

Фиксация больших настроек происходит медленно — это нужно делать в отдельном потоке. Рассмотрите возможность реализации этого в AsyncTask

person pixel    schedule 07.02.2011
comment
проверьте это, пожалуйста.. ссылка без потоков, но и без ожидания... я не могу понять... - person caw; 07.02.2011
comment
Я не знаю, достаточно ли быстро работает это приложение. Для объяснения проверьте этот вопрос (особенно 4-й пункт в ответе Брэда Фицпатрика): thread">Доступ к общим настройкам должен быть сделан вне потока пользовательского интерфейса - person pixel; 07.02.2011
comment
буду пробовать futuretask в удобное время. - person caw; 08.02.2011

Вы должны использовать метод apply(), который является асинхронным. См. документацию здесь

person user3712755    schedule 01.02.2015

Где ты это делаешь? OnSharedPreferenceChanged?

Если вы используете PreferenceActivity, вам не нужно вручную писать свои предпочтения, так как изменение состояния виджета пользователем должно изменить ключ, определенный в XML для PreferenceActivity.

person Android Dev Dude    schedule 07.02.2011
comment
я делаю это перед использованием PreferenceActivity на кнопке другого действия onclicklistener. - person caw; 07.02.2011