Как правильно реализовать прием сообщений WebSocket при использовании шаблона хранилища и сопрограмм? - PullRequest
0 голосов
/ 05 июля 2019

Я работаю над приложением Android с архитектурой MVVM, с компонентами жизненного цикла, LiveData и т. Д. На уровне модели / данных приложения используется шаблон репозитория, как предлагается в руководстве Android по архитектуре приложения.

Я использую OkHttp3 WebSockets для связи с сервером.В настоящее время я не хочу использовать LiveData в репозитории, поэтому вместо этого я использую обратные вызовы, например.

interface Repository {
   fun setOnMessageReceivedListener(listener: (Message) -> Unit)
}

Теперь я хочу начать использовать сопрограммы Kotlin для асинхронных задач.Я начал реализовывать их для других REST запросов, и все работает, как и ожидалось.

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

Должен ли я удалить шаблон прослушивателя и поместить полученное сообщение в цикл обработки событий?например,

interface Repository {
   suspend fun receiveMessage(): Message?
}

, а затем в ViewModel, чтобы сделать

...
someScope {
   launch {
      while(true) {
         val msg = repository.receiveMessage()
         if (msg == null) break
         else doSomethingWith(msg)
      }     
   }
}
...
...