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

Ответы на вопрос(6)

Ваш ответ на вопрос