【发布时间】:2019-02-19 18:35:31
【问题描述】:
我正在为 Android 构建一个库管理器应用程序,并尝试构建一个视图来显示从当前集合到根目录的“集合”(即文件夹)的层次结构。
数据库是用 Room 实现的(通过 collectionRepo 间接访问)。每个 Collection 对象都有一个唯一的键并且知道它的父键。
我想做什么:
- 给定当前集合的键,构建集合层次结构 直到根。
- 完成后,构建一个 UI 渲染 层次结构。
对于 Kotlin 的协程,这似乎应该很简单,但我无法正确构建协程。
由于对collectionRepo.getCollection(curKey) 的每次调用最终都会执行Room db 查询,因此它必须脱离主线程。但是我需要等待查询返回才能知道后续查询所需的 parentKey。
private suspend fun buildBackstackView() {
var curKey = collectionViewModel.getCurrentCollectionKey()
coroutineScope {
launch {
do {
val curCollection = when (curKey) {
"" -> {
Collection("", 0, "TOP", "") // collection's parent is root - create a fake root Collection to push to the stack
}
else -> {
collectionRepo.getCollection(curKey) // ultimately a Room database query
}
}
collectionStack.add(curCollection)
curKey = curCollection.key
} while (curKey != "")
}
}
withContext(Dispatchers.Main) {
...build UI view using collectionStack...
}
}
为了响应 Sergey 的请求,collectionRepo.getCollection() 只是将请求传递给定义 Room 查询的 DAO 方法。
@Query("SELECT * FROM collections WHERE `key` = :colKey LIMIT 1")
fun getCollection(colKey: String): Collection
【问题讨论】:
-
能否请您添加
collectionRepo.getCollection()方法的定义,coroutineScope是什么? -
我为方法调用添加了代码。 coroutineScope 来自 kotlinx kotlinlang.org/docs/reference/coroutines/…
标签: android kotlin android-room kotlinx.coroutines kotlin-coroutines