Как использовать каналы сопрограмм с обратными вызовами и функциями приостановки - PullRequest
0 голосов
/ 22 апреля 2020

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

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

...