Android Архитектурный репозиторий с источником информации TCP - PullRequest
0 голосов
/ 04 августа 2020

Мое Android Приложение основано на протоколе TCP.

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

Во всех примерах репозиториев, которые я видел, в репозитории всегда есть методы для вызова источника информации с возвратом (от Android разработчиков):

class UserRepository {
   private val webservice: Webservice = TODO()
   // ...
   fun getUser(userId: String): LiveData<User> {
       // This isn't an optimal implementation. We'll fix it later.
       val data = MutableLiveData<User>()
       webservice.getUser(userId).enqueue(object : Callback<User> {
           override fun onResponse(call: Call<User>, response: Response<User>) {
               data.value = response.body()
           }
           // Error case is left out for brevity.
           override fun onFailure(call: Call<User>, t: Throwable) {
               TODO()
           }
       })
       return data
   }
}

Функция getUser возвращает данные LiveData. В моем приложении метод Login ничего не возвращает, потому что я жду, пока сервер отправит байты со специальным кодом, чтобы узнать, что он отвечает на мой запрос входа.

Есть ли способ реализовать этот шаблон с такими протоколами TCP ?

Спасибо

1 Ответ

0 голосов
/ 06 августа 2020

Им, честно говоря, следовало написать следующий код:

class UserRepository {
   private val webService: WebService = TODO()
   // ...
   fun getUser(userId: String, successCallback: (User) -> Unit) {
       webService.getUser(userId).enqueue(object : Callback<User> {
           override fun onResponse(call: Call<User>, response: Response<User>) {
               successCallback(response.body())
           }

           // Error case is left out for brevity.
           override fun onFailure(call: Call<User>, t: Throwable) {
           }
       })
   }
}

LiveData не предназначена для одноразовых обратных вызовов.

Тогда назовите его

userRepository.getUser(userId) { user ->
    // do whatever
}

Для правильной реактивной реализации см. { ссылка }

...