ClosedReceiveChannelException和数据绑定的问题

时间:2019-06-08 22:14:44

标签: android kotlin android-databinding kotlin-coroutines

我正在编写一段使用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}"
    }

1 个答案:

答案 0 :(得分:0)

好-睡了一觉后,我发现我忘记在LiveData字段中使用text