【发布时间】:2019-06-08 22:14:44
【问题描述】:
我正在编写一段使用 Kotlin 协程 pipilens 和 Android 数据绑定的代码。
在工作时,我发现当我的 couroutine 由于“ClosedReceiveChannelException”而崩溃时,绑定视图模型(通过数据绑定)不会更新“数据绑定组件”。
fun onProcessStart(cachedImageId: String) = viewModelScope.launch {
text = "Started for image: $cachedImageId"
try {
val extractedTextPipe = extractText(cachedImageId)
val processedTextPipe = processText(extractedTextPipe)
val processedText = processedTextPipe.receive()
text = "Finished for image: $cachedImageId"
} catch (t: Throwable) {
Log.d("TEST", t.message+ " "+t)
text = "Failed for image: $cachedImageId with code: ${t.message}"
}
}
尽管触发了捕获并且Log.d 出现在日志中,但带有新消息的text 永远不会更新。
如果以下方法也不起作用,那就不足为奇了:
fun onProcessStart(cachedImageId: String) = viewModelScope.launch {
text = "Started for image: $cachedImageId"
try {
throw IllegalStateException()
text = "Finished for image: $cachedImageId"
} catch (t: Throwable) {
Log.d("TEST", t.message+ " "+t)
text = "Failed for image: $cachedImageId with code: ${t.message}"
}
}
以上代码有效 - 来自catch 的文本已更新。
我的问题是 - 为什么一旦 val processedText = processedTextPipe.receive() 抛出 ClosedReceiveChannelException text 值就停止更新。
-- 编辑 此问题也可以通过以下方式观察到:
text = "Started for image: $cachedImageId"
try {
delay(10000)
throw IllegalStateException()
} catch (t: Throwable) {
Log.d("TEST", t.message + " " + t + " " + Thread.currentThread().id)
text = "Failed for image: $cachedImageId with code: ${t.message}"
}
【问题讨论】:
标签: android kotlin android-databinding kotlin-coroutines