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

Я получаю эту ошибку: не могу получить доступ к базе данных в основном потоке, поскольку это может заблокировать пользовательский интерфейс на длительный период времени. Это происходит, когда я запускаю забавный turnAllWordsOn () в ViewModel (код ниже). Эта функция запускает сопрограмму, и я думал, что сопрограмма всегда работает в фоновом потоке. Так почему я получаю эту ошибку? Признателен за любую помощь

Во фрагменте:

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return when (item.itemId) {
        R.id.action_turn_all_words_on -> {
            viewModel.turnAllWordsOn()
            true
        }
    // othes items
    }

В ViewModel:

fun turnAllWordsOn() = viewModelScope.launch {
    wordDao.turnAllWordsOn()
}

В Дао:

@Query("UPDATE word_table SET shown = 1")
fun turnAllWordsOn()

person Alex Rodionow    schedule 07.04.2021    source источник


Ответы (2)


Вы должны пометить свою функцию Dao как функцию приостановки, если вы хотите, чтобы Room запускал ее в фоновом потоке. В противном случае все, что вы делаете, - это вызов синхронной функции из области сопрограммы.

@Query("UPDATE word_table SET shown = 1")
suspend fun turnAllWordsOn()

Кстати, функции приостановки не запускаются автоматически в фоновом потоке, однако Room выполняет необходимую работу за кулисами, когда вы помечаете запрос как приостановленный.

person Henry Twist    schedule 07.04.2021

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

  1. Использование RxJava:

    Completable.fromAction {wordDao.turnAllWordsOn ()}

  2. Использование Coroutine:

    @Query (показан UPDATE word_table SET = 1) приостановить забавный TurnAllWordsOn ()

person LuongXuanNam    schedule 17.04.2021