【问题标题】:Calling Mainactivity inside Viewmodel(updated)在 Viewmodel 中调用 Mainactivity(更新)
【发布时间】:2023-03-29 07:23:01
【问题描述】:

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

我的WebSocket 服务在MainActivity 中声明。

因此,MainActivity 需要在 ViewModel 中实例化。

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

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

还请建议我怎样才能让我的ViewModel 和 WebSocket 相互通信。

提前致谢。

【问题讨论】:

    标签: android android-studio kotlin mvvm viewmodel


    【解决方案1】:

    问题:

    你犯了两个大错误

    1-在activity或fragment中声明web web Socket

    在其视图模型中使用 Activity

    解释概念:

    1-您必须向 Web 套接字实现(创建实例、侦听、调用、连接和断开连接)声明分离的类以应用单一职责原则

    2-在 MVVM 中,视图和视图模型之间的关系是一个方向视图观察可观察到的视图模型内部,但是视图模型没有参考视图,不像 MVP 关系是 2 方向,所以你不应该在侧视图中声明你的主要活动型号

    解决方案:

    1-socket 类

    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 ------> 视图模型 ----------> 活动

    activity

    【讨论】:

    • 非常感谢朋友的点赞!我尝试将您的逻辑应用到我的 websocket 函数中,但我真的被卡住了。也许是因为我是 android 的蹒跚学步的孩子。请原谅我是一个菜鸟,但你能帮我创建 SocketService 类吗?如果有办法可以将文件以 zip 格式发送给您,那就太好了。
    • 更新:我一直在尝试实施您的建议。到目前为止,我已经编写了我的 socketservice.java 类。但是viewmodel-socketservice之间的接口没有设置。
    猜你喜欢
    • 2012-08-28
    • 2011-05-30
    • 2014-09-23
    • 1970-01-01
    • 2015-09-23
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多