Kotlin in Android - Функции приостановки в комнате - PullRequest
2 голосов
/ 15 февраля 2020

Я просматривал образец в https://github.com/android/architecture-samples/tree/dev-dagger/app/src/main/java/com/example/android/architecture/blueprints/todoapp/data/source/local ветви dev-dagger и в файле TasksLocalDataSource.kt они используют следующий метод:

override suspend fun getTasks(): Result<List<Task>> = withContext(ioDispatcher) {
        return@withContext try {
            Success(tasksDao.getTasks())
        } catch (e: Exception) {
            Error(e)
        }
}

Используя withContext с IO в качестве диспетчера, они хотят, чтобы сопрограмма работала в потоке IO. Но запрос Room tasksDao.getTasks() внутри метода является функцией приостановки. И в кодовой метке на https://codelabs.developers.google.com/codelabs/kotlin-coroutines/#8 они говорят, что Room заботится о выполнении запроса (здесь: getTasks()) в фоновом потоке, когда это функция приостановки, которая имеет место здесь. Итак, не слишком ли много, чтобы использовать также withContext(ioDispatcher)? Могу ли я не переписать описанный выше метод также, как следующим образом? :

override suspend fun getTasks(): Result<List<Task>> {
         return Success(tasksDao.getTasks())
}

1 Ответ

1 голос
/ 15 февраля 2020

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

...