【发布时间】:2019-06-19 15:01:50
【问题描述】:
我正在创建一个“会话”系统,用户可以在其中启动、完成和查看他的会话。
用户通过第一个片段创建他的会话,然后进入“会话中”片段。
如果他在完成会话之前返回主菜单,我希望他直接进入“会话中”而不通过“新会话”片段。
所有会话数据都存储在本地数据库中,我使用 Kotlin 协程从数据库中获取数据(参见下面的代码示例)
这是我第一次使用协程,我承认它有点模糊 对我来说,欢迎所有的帮助
问题是当用户按下按钮导航时,协程完成验证后查看是否有当前会话,导致验证一个null 对象或当前会话的上一个会话,因此导航到“新会话”片段
我需要的是一种等待协程完成然后 处理按钮点击
这里写的所有代码都包含在viewModel中。
这就是我设置作业/范围的方式
private var viewModelJob = Job()
private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)
这就是我启动协程的方式:
private fun initializeLastSession() {
uiScope.launch {
lastSession.value = getLastSessionFromDatabase()
}
}
private suspend fun getLastSessionFromDatabase(): Session? {
return withContext(Dispatchers.IO) {
var session = database.getLastSession()
session
}
}
在这个函数内部进行验证
fun isSessionActive(): Boolean {
//Simplified
if (lastSession.value = null) {
return false
} else if (...) {
return true
} else {
return false
}
当用户按下导航按钮时,从片段 itlsef 中的 if 语句调用最后一个函数“isSessionActive”。
如果为真,则导航到“InSession”,否则导航到“newSession”
我见过多种等待协程完成的方式,但没有一种方式与我启动它的方式相匹配,更没有适合我的解决方案。
【问题讨论】: