У меня есть SyncAdapter
, работающий на собственном процессе отдельно от основного процесса приложения.
Я использую статический класс-оболочку вокруг моего SharedPreferences
, который создает статический объект при загрузке процесса (Application 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
и приложение используют этот класс-оболочку для редактирования и получения из prefs, это работает иногда, но много раз я вижу, что SyncAdapter
получает старые/отсутствующие префы при обращении к префайлам, в то время как основное приложение правильно видит последние изменения.
Согласно документам, я думаю, что флаг MODE_MULTI_PROCESS
должен работать так, как я ожидаю, чтобы оба процесса могли видеть последние изменения, но это не работает.
Update:
Per x90
, я попытался воздержаться от использования статического объекта SharedPreferences
и вместо этого вызывать getSharedPreferences
для каждого метода get/set.
Это вызвало новую проблему, когда файл prefs удаляется (!!!) при одновременном доступе к нескольким процессам.
то есть в логарифме:
(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