android - ClosedReceiveChannelException 和数据绑定问题
问题描述
我正在编写一段代码,它使用 Kotlin 的协程 pipilens 和 Androids 数据绑定。
在工作时,我发现当我的 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}"
}
解决方案
好吧 - 经过一夜好眠后,我发现我忘记LiveData
在text
野外使用了。
推荐阅读
- r - 如何在 R 中确定日期间隔是否与数据框中同一个人的另一个日期间隔重叠?
- c# - 尝试在 websocket 消息事件中时无法实例化预制件
- java - 如何在通过 SQL 加载器将数据加载到数据库时从日文字符中修剪空格?
- r - 在 R 中堆叠 .rds 文件
- python - 在 Flask 中推送应用程序上下文
- haskell - 为什么这个功能没有触底
- odata - 使用 Automapper 的 OData 元数据
- pytorch - 如何在 BCELoss Pytorch 上检查准确性?
- avisynth - 在avisynth中使用ddcomb插件
- c++ - g++ -I 包含所有带有头文件的子目录