我正在编写一段使用Kotlin的协程pipilens和Androids数据绑定的代码。
在工作时,我发现当我的协程车由于“ 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}"
}
答案 0 :(得分:0)
好-睡了一觉后,我发现我忘记在LiveData
字段中使用text
。