【问题标题】:Passing data between Activity and ViewModel在 Activity 和 ViewModel 之间传递数据
【发布时间】:2019-01-12 18:56:03
【问题描述】:

我正在学习用于 Android 编程的新架构组件,但我很难理解活动的职责是什么。我知道他们只应该处理 UI,这是有道理的,但在多大程度上呢?假设我有一个活动,最初有一个 EditText,用户可以在其中输入字符串。在此下方有一个按钮,可添加另一个 EditText 供用户输入另一个字符串。应该如何在幕后处理这些数据?我想出的两个解决方案如下:

1) 处理 ViewModel 中的数据。

用户点击按钮 -> Activity 告诉 ViewModel -> ViewModel 维护 EditTexts 列表 -> 用户完成后,Activity 告诉 ViewModel -> ViewModel 处理数据

我在这种方法中看到的问题是,现在 ViewModel 中有 UI 元素,我必须处理某种状态(用户添加了一些 EditText,但随后取消了整个操作,ViewModel 必须清除它列表)

2) 处理Activity中的数据。

用户单击按钮 -> Activity 维护 EditTexts 列表 -> 用户完成后,Activity 将字符串列表发送到 ViewModel -> ViewModel 处理数据

我看到这种方法的问题是,如果视图被替换,现在视图中的逻辑必须被替换,它不像它应该的那样“愚蠢”。

处理这种情况的首选方法是什么?

【问题讨论】:

  • 该按钮是否仅用于创建新的EditText?它是否与已经存在的EditTexts 有任何关系?
  • @Anatolii 它没有

标签: android mvvm


【解决方案1】:

ViewModel 的第一个不应包含诸如 EditText 之类的视图,正如从 ViewModel page 中引用的那样:“警告:ViewModel 绝不能引用视图、生命周期或任何可能持有对活动上下文的引用的类."。当你这样做时,它可能会导致内存泄漏,因此不包括选项 1。

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

所以回答你的问题:在这种情况下,我将创建一个custom ListView,其中包含一个包含 EditText 的自定义视图。我们的 ViewModel 将包含一个名为条目的字符串列表的 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 中)。

希望这能回答你的问题。

最好的问候,

丁吉尼斯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-30
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    相关资源
    最近更新 更多