Android Thread Safe SharedPreferences - PullRequest
       12

Android Thread Safe SharedPreferences

3 голосов
/ 03 февраля 2012

Я не уверен, нужно ли мне это прямо сейчас, но если мое приложение когда-нибудь расширится, я смогу увидеть такую ​​возможность.У меня в основном есть обертка вокруг SharedPreferences, которая извлекает несколько значений из SharedPreferences и связывает их в объект.Он также берет объект и использует его для обновления настроек.Я хотел сделать это потокобезопасным, но я хотел попробовать это с семафором.Моя SharedPreferences оболочка получит ссылку на класс ниже от getSyncedPrefManager().Затем он вызовет aquireLock(), затем getPref(), выполнит свою работу и затем вызовет releaseLock().Это похоже на то, что будет работать, или я далеко от базы?

public class SyncedPreferenceManager {
    private final static SyncedPreferenceManager me =
                               new SyncedPreferenceManager();

    private SharedPreferences prefs;
    private static Semaphore mutex;

    public static SyncedPreferenceManager getSyncedPrefManager(){
        return me;
    }

    private SyncedPreferenceManager(){
        mutex = new Semaphore(1, true);
    }

    public SharedPreferences getPref(Context caller){
        if(prefs == null)
            prefs = PreferenceManager.getDefaultSharedPreferences(caller);
        return prefs;
    }

    public boolean aquireLock(){
        try {
            mutex.acquire();
        } catch (InterruptedException e) {
            return false;
        }
        return true;
    }

    public boolean releaseLock(){
        mutex.release();
        return true;
    }

}

Ответы [ 3 ]

0 голосов
/ 03 февраля 2012

Вам может не понравиться этот ответ.

Вы не используете правильную систему здесь. SharedPreferences предназначен для хранения простых настроек. То, что вы можете сделать это, не означает, что вы должны это делать. Вы в основном пытаетесь превратить SharedPreferences во что-то, чего нет. Вы можете добавить всю эту причудливую блокировку, но это не помешает кому-то войти в нее позже и случайно взорвать ее.

Если вы действительно нуждаетесь в этих функциях, вам следует обратить внимание только на использование sqlite напрямую. Нет никаких сомнений в том, что вы можете добавить синхронизацию в SharedPreferences (и я уверен, что она в некоторой степени безопасна, так как она уже разработана с использованием модели транзакции / принятия), но мне кажется, что изобретать колесо заново

0 голосов
/ 05 ноября 2014

Вы всегда можете внести изменения в SharedPreferences.Editor и использовать apply (), чтобы применить изменения атомарно.

editor.apply () доступно на уровне API 9.

Документация здесь: http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply()

0 голосов
/ 03 февраля 2012

Синхронизированных секций должно быть достаточно для этой цели. Обычно нет проблем с производительностью при сохранении / загрузке значений из предпочтений (там не так много значений).
И я тоже сомневаюсь, что тебе это нужно вообще. Предпочтения обычно загружаются при запуске активности или сохраняются в режиме паузы (в любом случае это своего рода поток песен, в данный момент только одно из действий в вашем приложении запускается или останавливается)

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

Я также разработал небольшую библиотеку-обертку, которая позволяет легко маршалировать / демаршировать предпочтения в свойствах объекта:

https://github.com/ko5tik/andject

...