【发布时间】:2019-06-20 14:53:27
【问题描述】:
根据 Google (link) 的 codelab 演示,我尝试将我的代码重构为 ViewModel + 协程。我的问题是,我想等待插入操作的结果,而不是仅仅插入数据(original code),如果插入成功,它应该返回 id,然后根据结果做一些事情。那么该怎么做呢?
目前,我向 ViewModel 插入方法发送一个方法作为回调。当然,观察 ViewModel 是另一种选择。但是有没有更好的解决方案?
我当前的代码:
事件活动:
viewModel.insert(Event("name"), {
if (it == -1L) {
Log.i("insert", "failure")
} else {
Log.i("insert", "success: $it")
}
})
事件视图模型:
private val mEventDao: EventDao = AppDatabase.getDatabase(application).eventDao()
private val mJob = Job()
private val mScope = CoroutineScope(Dispatchers.Main + mJob)
fun insert(event: Event, callback: (id: Long) -> Unit) {
mScope.launch(Dispatchers.IO) {
val result =
try {
// just for testing delay situation
delay(5000)
val id = mEventDao.insertEvent(event)
id
} catch (e: Exception) {
-1L
}
withContext(Dispatchers.Main) {
callback(result)
}
}
}
EventDao:
@Dao
interface EventDao {
fun insertEvent(event: Event): Long
}
【问题讨论】:
标签: android kotlin viewmodel kotlin-coroutines coroutine