Выбор ответа Junior Room и хранение данных обновлено

Запрос Room на главном потоке

Вопрос

Что будет при вызове синхронного (не suspend) DAO-метода fun all(): List<Article> на главном потоке?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Будет IllegalStateException: доступ к базе с главного потока запрещён. По умолчанию Room проверяет поток и запрещает обращение к базе с главного, чтобы не было подвисаний и ANR.

Варианты ответа

  1. Будет IllegalStateException: доступ к базе с главного потока запрещёнправильный ответ
  2. Всё сработает, просто медленнее, и Lint покажет предупреждение
  3. Room сам перенесёт запрос на фоновый executor и дождётся результата
  4. Вернётся пустой список, а реальный запрос выполнится в фоне позже

Разбор

По умолчанию Room проверяет поток и запрещает обращение к базе с главного, чтобы не было подвисаний и ANR. Решения: suspend-методы (Room сам выполняет их на фоновом executor), Flow, или явный перенос в withContext(Dispatchers.IO). allowMainThreadQueries() отключает проверку, но это только для тестов.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.