Firebase слушатель снимка в реальном времени, используя Coroutines - PullRequest
2 голосов
/ 01 апреля 2019

Я хочу иметь возможность прослушивать обновления в реальном времени в БД Firebase, используя сопрограммы Kotlin в моей ViewModel.

Проблема заключается в том, что при создании нового сообщения в коллекции мое приложение зависает и не восстанавливаетсяиз этого состояния.Мне нужно убить его и перезапустить приложение.

Впервые оно проходит, и я вижу предыдущие сообщения в пользовательском интерфейсе.Эта проблема возникает, когда SnapshotListener вызывается во второй раз.

Моя observer() функция

val channel = Channel<List<MessageEntity>>()
firestore.collection(path).addSnapshotListener { data, error ->
    if (error != null) {
        channel.close(error)
    } else {
        if (data != null) {
            val messages = data.toObjects(MessageEntity::class.java)
            //till this point it gets executed^^^^
            channel.sendBlocking(messages)
        } else {
            channel.close(CancellationException("No data received"))
        }
    }
}
return channel

Вот как я хочу наблюдать за сообщениями

launch(Dispatchers.IO) {
        val newMessages =
            messageRepository
                .observer()
                .receive()
    }
}

ПослеЯ заменил sendBlocking() на send() Я все еще не получаю новых сообщений в канале.SnapshotListener сторона выполнена

//channel.sendBlocking(messages) was replaced by code bellow
scope.launch(Dispatchers.IO) {
    channel.send(messages)
}
//scope is my viewModel

Как наблюдать сообщения в firestore / realtime-dbs, используя сопрограммы Kotlin?

1 Ответ

1 голос
/ 11 апреля 2019

В результате я использовал Поток , который является частью сопрограмм 1.2.0-alpha-2

return flowViaChannel { channel ->
   firestore.collection(path).addSnapshotListener { data, error ->
        if (error != null) {
            channel.close(error)
        } else {
            if (data != null) {
                val messages = data.toObjects(MessageEntity::class.java)
                channel.sendBlocking(messages)
            } else {
                channel.close(CancellationException("No data received"))
            }
        }
    }
    channel.invokeOnClose {
        it?.printStackTrace()
    }
} 

И вот как я наблюдаю это в моей ViewModel

launch {
    messageRepository.observe().collect {
        //process
    }
}

больше по теме https://medium.com/@elizarov/cold-flows-hot-channels-d74769805f9

...