在Activity和ViewModel之间传递数据

9
我正在学习Android编程的新架构组件,但是很难理解Activity的责任范围。我知道它们只应处理UI,这很有道理,但是到什么程度呢?假设我有一个Activity,在初始状态下,有一个EditText供用户输入一个字符串,有一个按钮在下面,点击后可以添加另一个EditText以供用户再次输入字符串。这些数据如何在后台处理呢?我想到的两个解决方案如下:
1)在ViewModel中处理数据。
用户单击按钮-> Activity告诉ViewModel-> ViewModel维护EditText列表-> 当用户完成操作时,Activity告诉ViewModel-> ViewModel处理数据
我认为这种方法的问题在于现在ViewModel中有了UI元素,我需要处理某种状态(例如,用户添加了一些EditText,但取消了整个操作,ViewModel必须清除其列表)
2)在Activity中处理数据。
用户单击按钮-> Activity维护EditText列表-> 当用户完成操作时,Activity将字符串列表发送给ViewModel-> ViewModel处理数据
我认为这种方法的问题在于现在View中有逻辑代码,如果替换了此View,需要更改该代码,它不够“愚笨”。
那么处理此情况的首选方式是什么呢?

这个按钮仅用于创建新的 EditText 吗?它是否与已经存在的 EditText 有任何关联? - Anatolii
@Anatolii 它不会。 - user2929779
1个回答

1

首先,ViewModel不应包含诸如EditText之类的View,正如从ViewModel page中引用的:“注意:ViewModel绝不能引用视图、生命周期或任何可能持有对活动上下文的引用的类。”。如果这样做,可能会导致内存泄漏,因此排除选项1。

其次,ViewModel不应用于处理数据,它只是数据的容器。处理应在后台执行,并将结果存储在ViewModel中,以便潜在的监听器可以对数据更改做出反应。

因此,为了回答您的问题:在这种情况下,我将创建一个自定义ListView,其中包含一个EditText的自定义视图。我们的ViewModel将包含一个名为entries的String列表的MutableLiveData,如下所示:MutableLiveData<List<String>> entries = new MutableLiveData<List<String>>();,我们可以通过调用setValue(object)方法来设置它。

当用户按下按钮时,EditText视图中的所有文本将合并为一个字符串列表,并使用setValue(object)方法将entries设置为创建的列表。所有监听entries的监听器都将提供新数据。因此,例如,您可以启动一个后台作业来处理新值,如下所示:model.entries.observe(this, Observer { ProcessStringListTask().execute(it) })(请注意,代码在Kotlin中)。希望这回答了您的问题。最好的问候,Dingenis。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接