2015-12-31 3 views
1

Я использую прослушиватель Firebase onChildAdded для хранения определенных частей данных в моем приложении для Android. Когда приложение запускается, это может срабатывать тысячи раз. Каждый раз, когда это срабатывает, я использую SharedPreferences apply, чтобы написать простую пару ключ/значение. Ключи и значения сами по себе не очень большие, но в SharedPreferences может быть несколько тысяч.Повторные вызовы для SharedPreferences apply() вызывает OutOfMemoryError

Я был в восторге от использования apply, потому что он делает некоторую магию вокруг кэширования в памяти и задерживает фактические XML-записи SharedPreferences. Тем не менее, я нахожу, что если я вызову apply 1000-2000 раз в течение нескольких секунд, я получаю ошибку OutOfMemory.

Внутренний, SharedPreferencesImpl, кажется, создает новый Map, основанный на старых Map, если записи в фактический XML по-прежнему находятся в очереди. Тем не менее, это вызывает то, что кажется несколько тысяч записей Map на куче Java (я считаю), и я получаю ошибку OutOfMemory.

Может быть, мне нужно позвонить commit каждые 50 или около того раз, когда я звоню apply - таким образом я не буду сталкиваться с ошибками OutOfMemory, хотя я могу заметить небольшой удар производительности? Что мне делать? В любом случае это похоже на хакки.

+2

Общие предпочтения не предназначены для хранения таких больших данных. Вы должны выбрать базу данных sql вместо –

+0

Мне трудно поверить, что SharedPreferences не может хранить несколько тысяч пар ключ/значение, где каждый ключ и значение всего несколько символов (максимум 50). –

+0

Да, но это проблема с вашим кодом –

ответ

0

Решение для меня состояло в том, чтобы использовать однопользовательский прослушиватель Firebase по месту нахождения, put моих тысяч элементов, тогда звоните apply(). Вы также должны отслеживать уже обнаруженные ключи (a HashSet of String s).

Тогда, сделайте ChildEventListener, и просто игнорируйте onChildAdded, если ключ существует в моем HashSet.

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