Запись в Царство в главном потоке.
Можно ли писать в Realm в главном потоке?
В основном я хотел бы написать некоторые ObjectA
в царство прямо перед началом ActivityA
,
однажды ActivityA
требует немедленного доступа (в onCreate
) чтобы ObjectA
- Могу ли я также прочитать в основной теме?
В основном это ObjectA
слишком большой, чтобы пройти через пакет, поэтому мне нужно сохранить его в кеше.
Сначала я думал о сохранении объекта в кеше in-mem, а затем о его сохранении в Realm после начала действия, но мне было интересно, смогу ли я пропустить необходимость записи собственного кеша in-mem.
2 ответа
Можно ли писать в Realm в главном потоке?
Запись в Realm в потоке пользовательского интерфейса имеет два значения:
1.) любые RealmResults, созданные с помощью API асинхронного запроса, будут оцениваться немедленно и синхронно в потоке пользовательского интерфейса при открытии транзакции.
2.) если фоновый поток уже пишет в Realm в транзакции, он будет блокировать поток пользовательского интерфейса, пока эта транзакция не будет зафиксирована.
В вашем случае вы, кажется, полагаетесь на Realm для немедленного кэширования в потоке пользовательского интерфейса для одного объекта, так что вы можете писать (не блокируясь), и вам сразу нужен один объект (так что вам нужно findFirst()
который является синхронным API).
Так что в вашем случае, скорее всего, безопасно использовать Realm в потоке пользовательского интерфейса.
В общем случае рекомендуется использовать для записи в Realm в фоновом потоке и чтения из Realm в потоке пользовательского интерфейса (сохраняя ссылку на поле на RealmResults, добавляя в него RealmChangeListener, а затем получая обновленные результаты по каждому изменению, внесенному в Realm),
В общем, делать что-либо кроме пользовательского интерфейса в основном потоке — плохая практика.
У нас есть приложение, которое работает, как описано в других ответах (запись в фоновом потоке, чтение в потоке пользовательского интерфейса), и оно вызывает множество ошибок ANR. На высокопроизводительных устройствах это почти незаметно, однако на младших устройствах постоянно возникают частые ошибки ANR (в секундах).
По этой причине мы удаляем любую загрузку БД в onCreate и рекомендуем всем сделать то же самое.
Лучше, чтобы в пользовательском интерфейсе отображалось сообщение/значок загрузки, чем вся активность прекращалась на несколько секунд.