Как использовать каналы сопрограмм с функциями обратного вызова и приостановки

Я новичок в 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 и как управлять каналом (закрытие и т. Д.)

Любая помощь или советы были бы замечательными.

0 ответов

Другие вопросы по тегам