2013-10-04 5 views
2

У меня возникают проблемы с попыткой заставить SharedPreferences работать.Android SharedPreferences, несовместимый между несколькими процессами

это код:

/** 
* Sets the software in synchronizing status. 
* @param synchronizing Boolean 
*/ 
public void setSynchronizing(boolean synchronizing) { 
    if(D) Log.d(TAG, "Called: setSynchronizing("+synchronizing+")"); 
    SharedPreferences preferences = mContext.getSharedPreferences(SharedPrefsConstants.PREFERENCES, 0); 
    SharedPreferences.Editor editor = preferences.edit(); 
    editor.putBoolean(SharedPrefsConstants.SYNCHRONIZING, synchronizing); 
    boolean result = editor.commit(); 
    if(!result) 
     Log.w(TAG, "Cannot store the preference."); 
    if(!synchronizing) 
     BroadcastUtils.stopSynchronizing(mContext); 
} 

/** 
* Returns whether the software is synchronizing. 
* @return True if synchronization is happening. 
*/ 
public boolean isSynchronizing() { 
    SharedPreferences preferences = mContext.getSharedPreferences(SharedPrefsConstants.PREFERENCES, 0); 
    boolean synchronizing = preferences.getBoolean(SharedPrefsConstants.SYNCHRONIZING, false); 
    if(D) Log.d(TAG, "Called: isSynchronizing Returning: "+synchronizing); 
    return synchronizing; 
} 

и это выход LogCat, обратите внимание, что я использую два отдельных процессы в моем приложении, я буду называть их приложением и приложения: Б.Г.:

**app** D/StorageManager﹕ Called: setSynchronizing(true) 
**app** D/StorageManager﹕ Called: setSynchronizing(true) 
**app** D/StorageManager﹕ Called: isSynchronizing Returning: true 
**app** D/StorageManager﹕ Called: isSynchronizing Returning: true 
**app:bg** D/StorageManager﹕ Called: setSynchronizing(false) 
**app** D/StorageManager﹕ Called: isSynchronizing Returning: true 

StorageManager одноэлементно экземпляр, но есть два из этих случаев, один для каждого процесса.

Даже если функция setSynchronizing (false) вызывается из фонового потока, файл физических предпочтений изменяется правильно, но в потоке переднего плана он по-прежнему является истинным.

Вы можете видеть, что isSynchronizing method возвращает true после того, как setSynchronizing устанавливает эту переменную в false. Вопрос: для чего это происходит? Это первый раз, когда я использую SharedPreferences в этом программном обеспечении, поэтому его нельзя установить нигде.

Это файл настройки хранятся внутри телефона, когда isSynchronizing еще возвращение TRUE:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?> 
<map> 
<boolean name="synchronizing" value="false" /> 
</map> 

Единственное, что я могу думать о том, что SharedPreferences держит какое-то кэш в памяти, если вы можете подтвердите это, есть способ принудительно обновить SharedPreference?

Я также должен сказать, что между переменной, заданной как false, и любым другим последующим вызовом isSynchronizing из переднего плана, происходит значительное количество времени.

+1

Как это возможно? – dymmeh

+0

Извините за это, отредактированный вопрос. –

+0

У вас вы пытались удалить приложение и снова установить его? – Emmanuel

ответ

1

Я нашел решение.

Похоже SharedPreferences не процесс-Safe класс, он может работать с несколькими процессами, если вы установите флаг при вызове getSharedPreferences:

MODE_MULTI_PROCESS 

Это решает проблему.

+1

Ошибка в 2.3 блокирует многопроцессорную связь: oshttp: // stackoverflow.com/questions/12125214/shared-preferences-between-two-processes-of-the-same-application – Bytecode

+0

Я уверен, что 'MODE_MULTI_PROCESS' просто вызывает' getSharedPreferences() 'для перезагрузки предпочтений из файла, если это необходимо, но только один раз*. На самом деле это не обеспечивает многопроцессорную безопасность. Есть [известные проблемы] (https://code.google.com/p/android/issues/detail?id=66625) с этим, даже с флагом, а исходный код ('SharedPreferencesImpl') не выглядит многопроцессорный сейф вообще. – Sam

+0

Этот флаг сейчас (SDK 23) устарел. Вместо этого следует использовать ContentProvider: https://developer.android.com/reference/android/content/Context.html#MODE_MULTI_PROCESS –

Смежные вопросы