Вызов Mainactivity внутри Viewmodel (обновлено) - PullRequest
0 голосов
/ 12 марта 2020

Для архитектуры MVVM необходимо вызвать переменную WebSocket в классе ViewModel.

А мой WebSocket сервис объявлен в MainActivity.

Итак, MainActivity необходимо создать в ViewModel.

Я пытался объявить экземпляр :: '' (активность как MainActivity) '' 'внутри моего класса ViewModel, но это выдает ошибку.

Я предполагаю, как я объявил LiveData переменные не совсем лучшие. Все, что я хотел, - это получить данные о температурных переменных (список из 6.). Но MutableLiveData<List<Int>> на самом деле не сработал.

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

Заранее спасибо.

1 Ответ

0 голосов
/ 12 марта 2020

проблема:

у вас есть две большие ошибки

1-объявление веб-сокета в действии или фрагмент

2-использование в своем действии модель представления

объяснить концепцию:

1 - вам нужно объявить отдельный класс для реализации веб-сокета (создать экземпляр, прослушать, вызвать, подключить и отключить), чтобы применить один принцип ответственности

2-В MVVM отношение между видом и моделью представления является однонаправленным, наблюдайте наблюдаемую модель внутреннего вида, но модель представления не имеет ссылки на представление, в отличие от отношения MVP, являющегося направлением 2, поэтому не следует объявлять основная деятельность в модели сбоку

Решение:

класс с 1 разъемом

class SocketService{
    companion object {val instance :SocketService}
    fun connect() 
    fun disconnect()
    fun sendMessage(invokeMethodName:String,data:JsonObject)
    fun subscribe(listenMethodName:String,listner:Listner)
    }

модель с 2 видами

  val receiveMessageResponse = MutableLiveData<String>()
      SocketService.instance!!.subscribe(RECEIVE_MESSAGE, HubEventListener {
                receiveMessageResponse.postValue(it)
            })

3-активность

viewModel.receiveMessageResponse.observe(this, Observer {
         //use the received message here
        })

Заключение:

socketService ------> просмотреть модель ----------> действие

активность <-------- viewmodel <------------- socketService </p>

...