【问题标题】:Issue with ClosedReceiveChannelException and Data BindingClosedReceiveChannelException 和数据绑定问题
【发布时间】: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


    【解决方案1】:

    嗯 - 经过一夜好眠后,我发现我忘记在 text 字段中使用 LiveData

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-05
      • 2018-12-01
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      相关资源
      最近更新 更多