Запись в Царство в главном потоке.

Можно ли писать в 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 и рекомендуем всем сделать то же самое.

Лучше, чтобы в пользовательском интерфейсе отображалось сообщение/значок загрузки, чем вся активность прекращалась на несколько секунд.

Другие вопросы по тегам