android-lifecycle - Android 从 ViewModel 调用 View Controller 方法
问题描述
我开始使用 Android JetPack(ViewModel、架构组件、LIfeCycle 等)。直到现在,我一直在使用 Model View Presenter 架构,实际上我发现它非常容易测试和维护架构。
另一方面,我可以看到改用 ViewModel 的最大优势是它们与活动和片段生命周期的原生耦合,这一直是 Android 开发人员最大的痛点之一,所以我认为这是向前迈出的一大步。
话虽如此,但我认为有一个很大的缺点:使用这种新方法,调用 Activity 或 Fragment 的方法似乎要棘手得多,因为正如官方文档中所述
ViewModel 绝不能引用视图、生命周期或任何可能持有对活动上下文的引用的类。
在 MVP 方法中,Presenter 与视图有一个契约,并且可以调用它的所有方法。我对如何使用架构组件解决这种情况进行了一些研究,但似乎没有简单而轻松的方法可以做到这一点:最后,您总是必须处理 ViewModel 中的状态并对活动和片段中的这些更改做出反应。有人建议使用SingleLiveEvent类,这使它更容易一些,但仍然比以前更痛苦。
所以我的问题是:
文档说你不能引用任何持有对活动上下文的引用的东西(我猜是为了避免内存泄漏),但是如果我这样做然后我清除 ViewModel 的 onCleared() 中的所有引用怎么办?
解决方案
我可以想到几种“通知用户”的方法ViewModel
:
- 一个
LiveData
改变和一个对象的Observer
数据 - 如果您不介意从
Broadcast
_BroadcastReceiver
Context
ViewModel
编辑:我知道这不完全是问题的答案,但我认为它消除了对它的需要
推荐阅读
- javascript - Axios.get 返回状态码 400 无法找出问题所在(SODAapi)
- excel - 如何在 Excel 中使用折线图类型将水平轴从类别更改为值
- python - mi PATH“-bash:ls:找不到命令”的问题请帮助:)
- javascript - 有没有办法在 MongoDB 中针对不同类型的文档进行单个查询,并将每种类型限制为一个集合中的特定数字?
- node.js - React js TypeError:无法读取未定义的属性“参数”
- c++ - C++ 与库的兼容性
- sql - SQL:为另一列的唯一条目平均一列的值
- python - 如何制作 Plotly Indicator 仪表的网格?
- javascript - 带有 LinkedIn API 的 ReactJS
- java - 从 wsdl 文件生成 java bean 骨架时为什么会显示错误(自上而下的方法)?