在 Viewmodel 中调用 Mainactivity(更新)

Calling Mainactivity inside Viewmodel(updated)

对于MVVM架构,需要在ViewModelclass中调用一个WebSocket变量。

而我的 WebSocket 服务是在 MainActivity 中声明的。

所以,MainActivity需要在ViewModel中实例化。

我试图声明一个实例:: ''' (activity 作为 MainActivity) ''' 在我的 ViewModel class 中,但这会引发错误。

我想我声明 LiveData 变量的方式并不是最好的。我只想访问温度变量的静态数据(6 个列表。但是 MutableLiveData<List<Int>> 并没有真正解决。

还请建议我还能如何让我的 ViewModel 和 WebSocket 相互通信。

提前致谢。

问题:

你有两个大错误

1-在activity或片段

中声明web web Socket

2-在其视图模型中使用 activity

解释概念:

1-你必须声明分离 class 到 web socket 实现(创建实例、监听、调用、连接和断开连接)以应用单一责任原则

2-在 MVVM 中,视图和视图模型之间的关系是一个方向 view observe observable inside view model,但是视图模型没有对 view 的引用,这与 MVP 关系是 2 个方向,所以你不应该声明你的 main activity 侧视图模型

解法:

1 个插槽 class

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-activity

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

结论:

socketService ------> 视图模型 ----------> activity

activity <-------- 视图模型 <------------ socketService