问题标签 [android-livedata]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
1517 浏览

android - Android架构组件和LiveData,太多的MutableLiveData对象?

在 android 架构组件发布之前,我开始从事一个项目,我拥有自己的 ViewModel,它与 Fragment 具有相同的生命周期,并且 ViewModel 状态保存在 Loader 内的 StateObject 中,以便状态可以在方向变化后继续存在。ViewModel 通过接口与 Fragment 通信。这很好用,因为 ViewModel 和 Fragment 具有相同的生命周期。我的 ViewModel 包含各种状态。它有一个 isLoading 布尔值、isEmptyStateVisible 布尔值等。每次状态发生变化时,我都会调用 view.notifyIsLoadingChanged(true/false) 之类的东西,在这种情况下,Fragment 会显示或隐藏一个微调器。

现在我将更改我的实现以将新的 ViewModel 与 LiveData 一起使用。实现 LiveData 的最快方法是更改​​ ViewModel 正在使用的 UI 界面的实现。所以我可以保留我当前的实现,只添加这个 UI 接口实现:

此类扩展的 LiveDataUI 类具有更多方法,例如:

有了这个实现,我最终会得到很多 MutableLiveData 对象,而且感觉不对。我是否在我的 ViewModel 中投入了太多的状态?我的想法是将所有逻辑都包含在 ViewModel 中,这样我就可以编写测试来验证在加载数据时 isLoading 是否为真,如果 Api 没有返回数据,则 isEmptyState 为真等。

我还注意到,如果我调用 setValue(state); 在同一个 MutableLiveData 对象上很短的时间内多次,onChanged 方法只被调用一次。那是对的吗?

0 投票
0 回答
1224 浏览

android - 活动恢复后的Android LiveData仅获取最新项目

我有聊天活动。因此,当我收到消息时,我会一一添加消息。

我正在尝试将 ViewModel 与 Activity 一起使用。我正在使用 LiveData 将消息从 ViewModel 传递到 Activity。当 Activity 处于活动状态时一切正常,但是当 Activity 处于隐藏状态时,我的观察者没有从 ViewModel 获取项目。此外,当我恢复活动时,我的观察者只会获得在 ViewModel 中分配给它的最新项目。

基本上,如果应用程序在后台,我需要缓冲项目,并将它们全部放在活动恢复中。

0 投票
1 回答
10179 浏览

android - Android LiveData Observer 首次更新后未激活

我正在尝试使用 Kotlin 对架构组件的实时数据进行基本实现,如下所示:

我的 ViewModel 类是这样创建的:

和我的存储库:

}

所有这些都非常有效,并且 UI 已按应有的方式更新,但只是第一次。如果我尝试手动调用从 UI 操作更新 viewModel,改造调用仍按预期工作,但新数据不会发送到 Fragment 中的观察者:

观察者在第一次触发后变为非活动状态是预期的行为吗?

0 投票
2 回答
747 浏览

android - 在 android 中使用 Retrofit 和 LiveData 执行序列异步 Web 请求链

所以我有三个retrofit web requests来自MainActivity的调用,每个调用都不会相互依赖。

所以让我们说第一个是getImages(),第二个getCountry()和最后一个getUser()

但是有一个条件是在所有这些请求都成功执行之前不应该加载下一个活动。

所以我在这里有两个选择

1)创建嵌套请求并在每个响应上执行每个请求 onSuccess 。这似乎可靠,但因此这些是我需要优化时间的异步调用。
2)创建一个变量并在每次成功调用时递增它,这种方法似乎节省时间,但我不确定这是一个好习惯。

那么有什么方法可以让我完成这项工作。.而且我没有使用RxAndroid

0 投票
1 回答
463 浏览

android - Observer MutableLive Data 中的 onChanged 函数在 android MVVM 中的第二次调用中表现异常

我的应用程序与 MVVM + 改造 + 匕首集成

对于 ViewModel,我使用 MutableLiveData 向 Fragment 和 ViewModel 注册观察者

因此,当视图加载时,它调用视图模型并调用 Web 服务,然后onChnaged观察者的函数将填充数据,但是当我添加一个按钮单击并调用相同的函数时,它的行为异常这里是代码示例。

因此,它第一次正确调用并记录成功,但可以说如果我再次按下按钮,最初它会在片段中打印成功,然后再次打印成功

对于这种不寻常的行为有任何想法。

0 投票
1 回答
3962 浏览

android - 从 JobService 观察 LiveData

我有一个存储库,其中包含该LiveData对象并供两者使用Activity,现在JobService(来自 Firebase 调度程序)通过ViewModel.

这里有简单的答案ServiceObserve LiveData from foreground service

但它没有提到如何为JobService.

0 投票
3 回答
8861 浏览

android - 更新数据库时 LiveData 列表不更新

我目前正在重构遗留代码以使用 Android 架构组件,并在一种存储库模式中设置房间数据库和 volley 请求。因此表示层/域层要求存储库获取 LiveData-Objects 以观察或告诉他与服务器同步,之后删除旧的数据库条目并从服务器重新获取所有当前条目。

我已经为同步部分编写了测试,所以我确信对象被正确地提取并插入到数据库中。但是,当编写测试以观察该数据库表的条目时(并测试对象是否正确保存以及在将它们放入数据库之前需要完成的所有操作)时,我正在观察的 LiveData> 不会被触发。

在下面的代码片段中,您可以假设 synchronizeFormsWithServer(...) 方法可以正常工作并且异步执行数据库操作。它包含从数据库中删除所有表单对象的操作,这些表单对象不在从服务器获取的表单列表中,并插入所有新的表单对象。因为在测试开始时数据库是空的,所以这应该没那么重要

未触发观察者的测试:

FormRepository 代码:

数据存储:

formDao 代码(数据库是按照您对房间的期望实现的):

很可能,我对 LiveData-Components 不了解,因为这是我第一次使用它们,所以我可能从根本上搞错了。

非常感谢每一点帮助:)

PS:我偶然发现了这篇文章,它讨论了一个类似的问题,但是由于我目前根本没有使用 DI,而只使用了一个 formrepository 实例(它只有一个 formDao 实例关联)我不认为这是一样的问题。

0 投票
1 回答
241 浏览

android - 带有 Kotlin 多个图层的 MutableLiveData 通用不起作用

Android MutableLiveData 与 Kotlin 多层通用不工作

这么多类型错误输出。

エラー: がありません - 未找到索引符

エラー: 类型なメソッド宣言です。戻り値の型が必需です。 - 无效的方法,需要返回类型

エラー:';'がありません - 未找到;

エラー: シンボルを见つけられません-找不到符号

エラー: 型引数の数が不正です。1个必需です - 参数计数错误。需要一个。

抱歉以上日文错误信息。

java.lang.IllegalStateException:分析失败:org.jetbrains.kotlin.kapt3.diagnostic.KaptError:注释处理时出错

0 投票
4 回答
11658 浏览

android - UnitTest 中 MutableLiveData 上的 setValue 和 postValue

我尝试在我的应用程序上测试一些方法,但在调用 mutablelivedata.postValue 时出现错误。这是一个片段和错误消息:

java.lang.RuntimeException:android.os.Looper 中的方法 getMainLooper 未模拟。有关详细信息,请参阅http://g.co/androidstudio/not-mocked

无论我使用 setValue() 还是 postValue(),都会收到此错误。我怎样才能让它工作?

0 投票
1 回答
6474 浏览

android - 使用 Room、ViewModel 和 LiveData 更改数据后重新加载 RecyclerView

我试图解决一个问题好几天,但没有成功。每当数据库(数据库室)中特定模型的记录发生更改时,我想更新我的 recyclerView。我使用 ViewModel 处理模型数据,记录列表存储在 LiveData 中。

数据库

模型

视图模型

分段

现在,我的问题是为什么观察者只被调用一次(在片段的开头),然后不再被回调?我怎样才能让观察者不断地监听数据库中的变化(插入、更新、删除),以便我的 recyclerView 可以立即更新?非常感谢您的任何建议。