我正在编写一段使用 Kotlin 的协程 pipilens 和 Androids Data Binding 的代码。
在工作时,我发现当我的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}"
}
好吧 - 经过一夜好眠,我发现我忘记在text
字段中使用LiveData
。