SharedPreference

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
bundos
Сообщения: 38
Зарегистрирован: 05 май 2013, 13:43

SharedPreference

Сообщение bundos » 24 июл 2013, 15:02

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

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: SharedPreference

Сообщение KamiSempai » 24 июл 2013, 17:35

Возможно, так было удобнее. Отгадка хранится глубоко в недрах исходного кода в момент создания контекста.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: SharedPreference

Сообщение KamiSempai » 24 июл 2013, 18:00

Выяснил в чем причина. Оказывается при вызове getPreferences или getSharedPreferences создается один объект и помещается в HashMap. При следующем вызове новый объект не создается, а вытаскивается из HashMap.
Следовательно, если мы получим SharedPreference в разных потоках, может получиться ситуация когда оба потока независимо друг от друга начинаю вносить изменения в SharedPreference. Получится каша из данных двух потоков. Что бы этого избежать используется Editor. Каждый поток получит свой независимый Editor, а следовательно описанная выше ситуация не случится. Единственной проблемой тут будет то, что изменения учтутся только для того потока, который сделал commit последним, но это лучше чем получить набор не связных данных.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

bundos
Сообщения: 38
Зарегистрирован: 05 май 2013, 13:43

Re: SharedPreference

Сообщение bundos » 25 июл 2013, 09:08

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

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: SharedPreference

Сообщение KamiSempai » 25 июл 2013, 14:46

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

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

Ответить