Страница 1 из 1

SharedPreference

Добавлено: 24 июл 2013, 15:02
bundos
Я не совсем понимаю, с какой целью было сделано, что для внесения изменений в xml требуется создавать реализацию интерфейса editor? Чем это лучше того, что мы просто определили бы метод commit класса SharedPreference, не требующий реализацию интерфейса Editor?

Re: SharedPreference

Добавлено: 24 июл 2013, 17:35
KamiSempai
Возможно, так было удобнее. Отгадка хранится глубоко в недрах исходного кода в момент создания контекста.

Re: SharedPreference

Добавлено: 24 июл 2013, 18:00
KamiSempai
Выяснил в чем причина. Оказывается при вызове getPreferences или getSharedPreferences создается один объект и помещается в HashMap. При следующем вызове новый объект не создается, а вытаскивается из HashMap.
Следовательно, если мы получим SharedPreference в разных потоках, может получиться ситуация когда оба потока независимо друг от друга начинаю вносить изменения в SharedPreference. Получится каша из данных двух потоков. Что бы этого избежать используется Editor. Каждый поток получит свой независимый Editor, а следовательно описанная выше ситуация не случится. Единственной проблемой тут будет то, что изменения учтутся только для того потока, который сделал commit последним, но это лучше чем получить набор не связных данных.

Re: SharedPreference

Добавлено: 25 июл 2013, 09:08
bundos
Вроде понятно, в первом приближении, спасибо! Не ясно почему учтутся изменения потока, который сделал commit последним? И еще: почитав офф. хелпа про HashMap толком не понял, зачем оно надо? Вы говорили, что объект SharedPreferences создается и кладется в HashMap. HashMap для всего приложения один и кто его создает? Я точно не создаю. И вот: куда данные попадают, когда я вызваю метод putString интерфейса editor?

Re: SharedPreference

Добавлено: 25 июл 2013, 14:46
KamiSempai
bundos писал(а):Вроде понятно, в первом приближении, спасибо! Не ясно почему учтутся изменения потока, который сделал commit последним? И еще: почитав офф. хелпа про HashMap толком не понял, зачем оно надо? Вы говорили, что объект SharedPreferences создается и кладется в HashMap. HashMap для всего приложения один и кто его создает? Я точно не создаю. И вот: куда данные попадают, когда я вызваю метод putString интерфейса editor?
HashMap создается автоматически при запуске приложения, за это отвечает система.

Editor работает следующим образом. При вызове метода edit создается объект реализующий этот интерфейс. В объекте есть HashMap который хранит все изменения которые вы произвели при помощи put методов. У каждого Editor свой HashMap. Когда вызывается commit все эти изменения записываются в файл. Тут и ежу понятно, что второй Editor поменяет все изменения предыдущего. Однако бояться тут не нужно, перепишутся только те значения, что были изменены. Например, если один Editor изменит значение "value1", а второй "value2", то оба изменения вступят в силу не зависимо от порядка.