MODE_MULTI_PROCESS для SharedPreferences не работает
у меня естьSyncAdapter
работает отдельно от основного процесса приложения.
Я использую статический класс-оболочку вокруг моегоSharedPreferences
который создает статический объект при загрузке процесса (приложенияonCreate
) вот так:
myPrefs = context.getSharedPreferences(MY_FILE_NAME, Context.MODE_MULTI_PROCESS | Context.MODE_PRIVATE);
Оболочка имеет методы get и set, например:
public static String getSomeString() {
return myPrefs.getString(SOME_KEY, null);
}
public static void setSomeString(String str) {
myPrefs.edit().putString(SOME_KEY, str).commit();
}
И то и другоеSyncAdapter
и приложение использует этот класс-обертку для редактирования и получения настроек, это иногда работает, но часто я вижуSyncAdapter
получать старые / отсутствующие префы при доступе к префсам, в то время как основное приложение правильно видит последние изменения.
В соответствии с документами, я думаю,MODE_MULTI_PROCESS
Флаг должен работать так, как я ожидаю, позволяя обоим процессам видеть последние изменения, но это не работает.
Обновить:
вx90
Я пытался воздержаться от использования статическогоSharedPreferences
объект и вместо вызоваgetSharedPreferences
на каждый метод get / set. Это вызвало новую проблему, когда файл prefs удаляется (!!!) при многопроцессорном одновременном доступе. то есть я вижу в logcat:
(process 1): getName => "Name"
(process 2): getName => null
(process 1): getName => null
и с этого момента все префы сохранены наSharedPreferences
объект был удален
Это, вероятно, результат другого предупреждения, которое я вижу в журнале:
W/FileUtils(21552): Failed to chmod(/data/data/com.my_company/shared_prefs/prefs_filename.xml): libcore.io.ErrnoException: chmod failed: ENOENT (No such file or directory)
P.S. Это не детерминистическая проблема, я видел вышеупомянутые журналы после сбоя, но не мог еще воссоздать на том же устройстве, и до сих пор это не происходило на других устройствах.
ДРУГОЕ ОБНОВЛЕНИЕ:
Я отправил отчет об ошибке, написав небольшой метод тестирования, чтобы подтвердить, что это действительно проблема с Android.https://code.google.com/p/android/issues/detail?id=66625