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