Как использовать каналы сопрограмм с функциями обратного вызова и приостановки
Я новичок в Coroutine Channels и работаю со сторонней библиотекой обмена сообщениями под названием Pubnub.
Он в значительной степени полагается на обратные вызовы для различных операций, таких как получение сообщений, изменение пользовательских событий.
См. Пример стиля обратного вызова ниже:
class PubNubMessagesCallback(private val mapper: PubNubMapper,
private val continuation: CancellableContinuation<Outcome<ChatMessage>>) : SubscribeCallback() {
override fun signal(pubnub: PubNub, pnSignalResult: PNSignalResult) {
}
override fun status(pubnub: PubNub, pnStatus: PNStatus) {
}
override fun user(pubnub: PubNub, pnUserResult: PNUserResult) {
}
override fun messageAction(pubnub: PubNub, pnMessageActionResult: PNMessageActionResult) {
}
override fun presence(pubnub: PubNub, pnPresenceEventResult: PNPresenceEventResult) {
}
override fun membership(pubnub: PubNub, pnMembershipResult: PNMembershipResult) {
}
override fun message(pubnub: PubNub, pnMessageResult: PNMessageResult) {
val outcome = mapper.createMessage(pnMessageResult)
continuation.resume(outcome)
}
override fun space(pubnub: PubNub, pnSpaceResult: PNSpaceResult) {
}
}
Теперь у меня есть функция на уровне Interactor, которая выполняет кучу вещей, настраивает клиента, добавляет слушателя и выполняет вызов:
@Throws(Exception::class)
suspend fun listenForMessages(room: Room): Outcome<ChatMessage> {
return withContext(dispatcher) {
pubNub = pubNubConfigurator.configureClinicClient()
pubNub?.let {
suspendCancellableCoroutine { continuation: CancellableContinuation<Outcome<ChatMessage>> ->
it.run {
addListener(callbackReference)
}
}
} ?: Outcome.Error("errorMessage")
}
}
Я видел несколько рекомендаций по использованию каналов для потока изменений.
Однако я не уверен, как это настроить в контексте функции обратного вызова и приостановки с liveata и как управлять каналом (закрытие и т. Д.)
Любая помощь или советы были бы замечательными.