Запись в Realm в основном потоке.

Можно ли писать в Realm в основной теме?

По сути, я хотел бы написать ObjectA в Realm прямо перед запуском ActivityA.

После запуска ActivityA ему требуется немедленный доступ (в onCreate) к ObjectA - могу ли я также читать в основном потоке?

По сути, этот ObjectA слишком велик, чтобы пройти через пакет, поэтому мне нужно сохранить его в кеше.

Сначала я думал о том, чтобы сохранить объект в кеше в памяти, а затем сохранить его в Realm после начала действия, но мне было интересно, могу ли я пропустить необходимость писать свой собственный кеш в памяти.


person LyteSpeed    schedule 09.06.2017    source источник
comment
Как получить ObjectA? Вы можете поместить его в Realm через initialData()? Причина, по которой обычно не рекомендуется использовать транзакцию в потоке пользовательского интерфейса, заключается в том, что 1.) транзакции фонового потока блокируют вызов beginTransaction(), поэтому вы можете отключить ANR, если у вас есть транзакции потока bg, и 2.) он заставляет асинхронные запросы выполняться синхронно. В противном случае это работает, и вы все равно захотите использовать findFirst()   -  person EpicPandaForce    schedule 09.06.2017
comment
Что такое initialData()? Да, имеет смысл запускать их в фоновом потоке. Поэтому я думаю сначала хранить эти данные в памяти, а затем лениво хранить их в Realm. Мне просто было интересно, смогу ли я избежать кеша в памяти с помощью Realm, но похоже, что я не могу.   -  person LyteSpeed    schedule 09.06.2017
comment
Почему бы не показать счетчик, сохранить в фоновом потоке, подождать, пока это не будет сделано, скрыть счетчик, запустить активность, прочитать в основном потоке в ActivityB (чтение происходит быстро, если это один объект), вы передаете ему идентификатор объекта.   -  person Martin Marconcini    schedule 09.06.2017
comment
@clu хм? Я только что сказал, что вы можете избежать кэша в памяти с помощью Realm.   -  person EpicPandaForce    schedule 09.06.2017
comment
Действительно? Кажется, я не понял вашего комментария. Если я хочу избежать сохранения объекта в основном потоке, я должен сделать это в фоновом потоке. В этом случае мне также нужно загрузить его из фонового потока. Это хорошо, но мне нужно показать счетчик (как предлагает Мартин), пока он загружается из потока bg. Это то, что вы имели в виду? Если нет, то не могли бы вы уточнить. Спасибо!   -  person LyteSpeed    schedule 09.06.2017
comment
In which case I **need to also load it from the background thread**. неправильно, потому что Realm работает не так. Realm предоставляет прокси-сервер с ленивой загрузкой, ограниченный потоком, для потока пользовательского интерфейса вам необходимо получить доступ к объекту в потоке пользовательского интерфейса с помощью экземпляра Realm потока пользовательского интерфейса. В вашем случае, если у вас нет длительных транзакций фонового потока, даже сохранение в потоке пользовательского интерфейса в порядке.   -  person EpicPandaForce    schedule 09.06.2017


Ответы (1)


Можно ли писать в Realm в основной теме?

Запись в Realm в потоке пользовательского интерфейса имеет два последствия:

1.) любые RealmResults, созданные API-интерфейсом асинхронного запроса, будут оцениваться немедленно и синхронно в потоке пользовательского интерфейса при открытии транзакции.

2.) если фоновый поток уже выполняет запись в Realm в транзакции, он будет блокировать поток пользовательского интерфейса до тех пор, пока эта транзакция не будет зафиксирована.

В вашем случае использования вы, кажется, полагаетесь на Realm для немедленного кэширования в потоке пользовательского интерфейса для одного объекта, поэтому вы можете писать (без блокировки), и вам нужен один объект немедленно (поэтому вам нужен findFirst(), который является синхронным API ).

Так что в вашем случае, скорее всего, безопасно использовать Realm в потоке пользовательского интерфейса.


В общем, передовой практикой Realm является запись в Realm в фоновом потоке и чтение из Realm в потоке пользовательского интерфейса (путем сохранения ссылки на поле RealmResults, добавления к нему RealmChangeListener и последующего получения обновленных результатов при каждом изменении, внесенном в Realm) .

person EpicPandaForce    schedule 10.06.2017
comment
Потрясающий! Спасибо за ответ :). Также вы знаете, где это задокументировано на realm.io? Если у вас нет его под рукой, не беспокойтесь об этом. - person LyteSpeed; 10.06.2017
comment
Вау, я так и не ответил, wtf, в любом случае см. здесь medium.com/@Zhuinden/ - person EpicPandaForce; 01.08.2018