Я пишу фрагмент кода, в котором используются сопрограммы Kotlin Pipilens и привязка данных Android.
Во время работы я обнаружил, что при сбое моей процедуры из-за '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
перестает обновляться.
- edit. Эту проблему также можно наблюдать со следующими параметрами:
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}"
}