我正在学习用于Android编程的新体系结构组件,并且很难理解一项活动的职责。我知道他们只应该处理UI,这很有意义,但是到什么程度呢?假设我有一个活动,最初有一个EditText,用户可以在其中输入String。在此下方有一个按钮,用于添加另一个EditText供用户输入另一个String。在后台如何处理这些数据?我提出的两个解决方案如下:
1)处理ViewModel中的数据。
用户单击按钮->活动告诉ViewModel-> ViewModel维护EditTexts列表->完成操作后,活动告诉ViewModel-> ViewModel处理数据
我用这种方法看到的问题是,现在ViewModel中有UI元素,我将不得不处理某种状态(用户添加一些EditTexts,然后取消整个操作,而ViewModel必须清除其列表)
2)处理活动中的数据。
用户单击按钮->活动将维护EditText列表->完成操作后,活动将字符串列表发送到ViewModel-> ViewModel处理数据
我用这种方法看到的问题是,如果曾经替换过该视图,则视图中现在必须替换逻辑,而不是应有的“愚蠢”。
处理这种情况的首选方式是什么?
小智 1
ViewModel 的第一个部分不应包含诸如 EditText 之类的视图,如 ViewModel页面中引用的那样:“警告:ViewModel 绝不能引用视图、生命周期或任何可能保存对活动上下文的引用的类。”。当您这样做时,可能会导致内存泄漏,从而排除选项 1。
其次,ViewModel 不应该用于处理数据,它只是数据的容器。处理应该在后台执行,结果应该存储在 ViewModel 中,以便潜在的侦听器可以对数据更改做出反应。
所以回答你的问题:在这种情况下,我将创建一个自定义 ListView,其中包含一个包含 EditText 的自定义视图。我们的 ViewModel 将包含称为条目的字符串列表的 MutableLiveData,MutableLiveData<List<String>> entries = new MutableLiveData<List<String>>();我们可以通过调用该setValue(object)方法来设置它。
当用户按下按钮时,EditText 视图中的所有文本都会组合在一个字符串列表中,我们entries使用该方法将其设置为创建的列表setValue(object)。的所有听众都entries将获得新数据。例如,您可以启动后台作业来处理新值,如下所示:(model.entries.observe(this, Observer { ProcessStringListTask().execute(it) })请注意,代码位于 Kotlin 中)。
希望这能回答您的问题。
此致,
丁格尼斯
| 归档时间: |
|
| 查看次数: |
1945 次 |
| 最近记录: |