Совместное использование каналов сопрограмм и компоновщика Liveata - PullRequest
0 голосов
/ 23 октября 2019

Как я могу использовать каналы сопрограмм вместе с компоновщиком liveata сопрограмм (androidx.lifecycle:lifecycle-livedata-ktx architecture component) для непрерывного прослушивания сообщений, генерируемых из библиотеки веб-сокетов, в ReceiveChannel<String>?

Моя первая мысль - реализовать это следующим образом

val user: LiveData<String> = liveData {
    while(true) {
        val data = myWebsocketChannel.receive() //Channel suspend function
        emit(data)
    }
}

Но это звучит немного "не-котлино", и моя интуиция говорит мне, что лучше это решить. Есть ли лучший способ обработки данных, полученных после получения канала сопрограммы?

1 Ответ

0 голосов
/ 03 ноября 2019

Я бы написал так:

val user: LiveData<User> = liveData {
    myWebsocketChannel.consumeEach { data ->
       emit(data)
   }
}

myWebsocketChannel.consumeEach { ... } будет повторяться вечно (приостановка, если канал пуст), пока кто-то не закроет myWebsocketChannel. Со стороны производителя - там, где мы слушаем сокет, мы должны быть осторожны, чтобы не закрыть канал преждевременно.

Надеюсь, это поможет:)

...