Обязательно ли писать запросы в room вне основного потока в Android?

#android #sqlite #android-room

#Android #sqlite #android-room

Вопрос:

Я хочу интегрировать базу данных Room в мое приложение для Android (JAVA).
Я просмотрел множество материалов, доступных в Интернете для базы данных Room, но ни одно из них не развеяло мои сомнения, которые

  1. Обязательно ли записывать запросы из основного потока?
  2. Если да, то что произойдет, если мы напишем запросы в основном потоке?

Ответ №1:

  1. Обязательно ли записывать запросы из основного потока?

НЕТ

Вы можете разрешить выполнение запросов в основном потоке, инициализировав с помощью .allowMainThreadQueries()

  Room.databaseBuilder(this, MyRoomDataBase::class.java, DATABASE_NAME).allowMainThreadQueries()
  
  1. Если да, то что произойдет, если мы напишем запросы в основном потоке?

Если вы указали, .allowMainThreadQueries() то это заблокирует основной поток до тех пор, пока запрос не будет выполнен, в противном случае это приведет к сбою IllegalStateException , и ваше приложение завершит работу. Лучше не запрашивать в основном потоке

Комментарии:

1. Спасибо @Manohar Reddy

2. Правильный ответ на второй вопрос был бы «Если вы указали .allowMainThreadQueries() , то он заблокирует основной поток до тех пор, пока запрос не будет выполнен, в противном случае он выдает ошибку IllegalStateException , и ваше приложение вылетает».

3. @musooff спасибо отредактировано, вы всегда можете отредактировать, если считаете, что это добавляет какую-то ценность к ответу.

4.Привет, мы используем rooms в сервисе в отдельном процессе от MainActivity . Служба будет продолжать работать даже после MainActivity закрытия. Я просто хочу узнать мнение других людей, если это хорошая идея разрешить .allowMainThreadQueries() в базе данных rooms в этом случае? На данный момент мы это разрешили. Все запросы к базе данных выполняются посредством передачи сообщений от Flutter к MainActivity серверной части Service . Мы не блокируем Flutter сбоку, используя async MethodChannel s.

Ответ №2:

По умолчанию запросы Observable room выполняются из основного потока пользовательского интерфейса. Если вы хотите запускать их через основной поток, вам нужно указать это с помощью приведенного ниже кода.

 Room.databaseBuilder(this, MyRoomDataBase::class.java, DATABASE_NAME).allowMainThreadQueries()
  

ЕСЛИ вы переносите свой возвращаемый тип в LiveData, вам не нужно устанавливать allowMainThreadQueries() , запросы выполняются асинхронно в фоновом потоке с LiveData, и вы можете наблюдать за ним, чтобы получать обновления в этих данных.

Вы можете разрешить запросы в основном потоке, если ваша база данных меньше по размеру и вы не выполняете никаких тяжелых операций над базой данных, в противном случае builder может заблокировать пользовательский интерфейс на длительный период времени.