2012-02-03 4 views
3

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

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; 
    } 

} 
+0

Мне любопытно, что вы нашли, когда вы сравнили это SharedPreferences поддержанные реализацию в вашу реализацию SQLite. Я провел аналогичные тесты и обнаружил, что SharedPreferences будет примерно в 50 раз быстрее, чем SQLite, поэтому я использую SharedPreferences везде, где я не храню тонны данных. –

+0

Я перешел в систему 'SQLite' некоторое время назад, и с тех пор он работает намного быстрее. Тем не менее, я в значительной степени сделал полную переписку приложения, так что это могло быть несколько вещей, которые способствовали этому. В любом случае гораздо проще работать с 'SQLite', чем' SharedPreferences' (и более «правильно»), по крайней мере, для моих целей. – Eliezer

ответ

0

Вы не мог бы этот ответ.

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

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

+0

lol Вы на самом деле находитесь на месте. У меня есть это приложение, реализованное в sqlite, и я хотел бы посмотреть, как изменится производительность (как бы незначительная) и практика кодирования. На самом деле все, что я хочу знать, это то, что если код выше сделает его потокобезопасным (не пытается звучать snippy) – Eliezer

+0

Единственное, что в приведенном выше коде, которое я могу сразу увидеть, не является потокобезопасным, - это ваше ленивое однопользовательское статичное устройство. Вы захотите взглянуть на http://stackoverflow.com/questions/3635396/pattern-for-lazy-thread-safe-singleton-instantiation-in-java#3635619. Кроме того, у вас есть суть семафора. –

+0

Спасибо! Не могли бы вы сказать, что исправленный код выше установлен? – Eliezer

0

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

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

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

https://github.com/ko5tik/andject

+0

У меня есть услуги, которые можно было бы читать и писать в Предпочтениях одновременно. Очень маловероятно, что это произойдет, но я подумал, что всегда лучше планировать заранее :) В любом случае я просто хотел что-то простое, и я никогда раньше не использовал «Семафор», поэтому я решил, что это будет хороший шанс попробовать ,Будет ли это поддерживать поток в потоковом режиме или я должен использовать его каким-то другим способом? – Eliezer