Android: kotlin фоновое задание сопрограммы - PullRequest
1 голос
/ 17 апреля 2020

У меня есть метод

fun refrehList() {
    viewModelScope.launch {
        myData.value = withContext(Dispatchers.Default) {
            summaryRepository.getSummaries(true)
        }
        allData.value = withContext(Dispatchers.Default) {
            SummaryRepository.getSummaries(false)
        }
    }
}

Это правильный способ использования сопрограммы. Операция БД происходит в фоновом режиме

Ответы [ 2 ]

3 голосов
/ 17 апреля 2020

Если вы используете Room, его документация гласит следующее:

Вы можете добавить ключевое слово suspend Kotlin к вашим методам DAO, чтобы сделать их асинхронными, используя функциональность Kotlin сопрограмм. Это гарантирует, что они не могут быть выполнены в главном потоке.

Таким образом, вы можете безопасно вызывать свой репозиторий внутри viewModelScope без изменения контекста.

Вы можете найти документацию этой комнаты секция здесь .

1 голос
/ 17 апреля 2020

Да, этот код будет выполняться в отдельном потоке, но один за другим. Также вы должны использовать Dispatchers.IO для вызовов базы данных вместо Dispatchers.Default См. Io vs Default .

viewModelScope.launch {
        myData.value = withContext(Dispatchers.IO) {
           Log.e("thread1", Thread.currentThread().name)
            summaryRepository.getSummaries(true)
        }
         Log.e("thread2", Thread.currentThread().name)
        allData.value = withContext(Dispatchers.IO) {
           Log.e("thread3", Thread.currentThread().name)
            SummaryRepository.getSummaries(false)
        }
    }

Это напечатает что-то вроде: -

E/thread: DefaultDispatcher-worker-1
E/thread2: main
E/thread3: DefaultDispatcher-worker-1

Если вы хотите запустить эту подпрограмму параллельно, вы можете использовать async-await.

...