Android 中的 Kotlin - 在 Room 中暂停功能
Kotlin in Android - Suspend Functions in Room
我在 dev-dagger
分支的 https://github.com/android/architecture-samples/tree/dev-dagger/app/src/main/java/com/example/android/architecture/blueprints/todoapp/data/source/local 查看示例,在 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 requesttasksDao.getTasks()
是一个suspend函数。在 https://codelabs.developers.google.com/codelabs/kotlin-coroutines/#8 的代码实验室中,他们说 Room
在后台线程上处理 运行ning 请求(这里:getTasks()
),当它是一个挂起函数时这里就是这种情况。
那么,使用 withContext(ioDispatcher)
是不是太过分了?我不能像下面这样重写上面的方法吗? :
override suspend fun getTasks(): Result<List<Task>> {
return Success(tasksDao.getTasks())
}
是的,这正是你应该写的。从引入可挂起的房间调用之前开始,文档中似乎仍有很多遗留问题。将可挂起的函数调用强制到 IO 调度程序中,无论是在可读性和性能方面都是一种浪费。
我在 dev-dagger
分支的 https://github.com/android/architecture-samples/tree/dev-dagger/app/src/main/java/com/example/android/architecture/blueprints/todoapp/data/source/local 查看示例,在 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 requesttasksDao.getTasks()
是一个suspend函数。在 https://codelabs.developers.google.com/codelabs/kotlin-coroutines/#8 的代码实验室中,他们说 Room
在后台线程上处理 运行ning 请求(这里:getTasks()
),当它是一个挂起函数时这里就是这种情况。
那么,使用 withContext(ioDispatcher)
是不是太过分了?我不能像下面这样重写上面的方法吗? :
override suspend fun getTasks(): Result<List<Task>> {
return Success(tasksDao.getTasks())
}
是的,这正是你应该写的。从引入可挂起的房间调用之前开始,文档中似乎仍有很多遗留问题。将可挂起的函数调用强制到 IO 调度程序中,无论是在可读性和性能方面都是一种浪费。