问题标签 [mediatorlivedata]

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 投票
1 回答
166 浏览

android - 将不同的依赖 LiveData 对象合并为一个

这是我的问题。我必须将三个不同LiveData对象的数据生成到一个对象中。其中两个取决于其中之一。仅当收到所有三个对象数据时才应触发观察者。

这是一个例子:

生成的对象包含产品信息和该产品的特定评论评级。结果对象如下所示:

源分布在不同的数据库位置。

第一个对象UserRating包含附加数据 ( customTags) 和只有两个键,引用产品和评级信息。

RatingProduct持有特定信息的对象。

任务是将所有数据从 和 收集UserRating到一个Rating,但隐藏必要的步骤。ProductRatedProduct

我认为最好的方法是使用三个不同的LiveData对象并在MediatorLiveData

但我不确定如何以正确的方式做到这一点。我有点卡住了。我知道如何将UserRatingLiveDataas 源添加到,MediatorLiveData但我不知道如何添加剩余的两个,调用它们RatingLiveData以及ProductLiveData关于UserRatingLiveData.

第二个问题是,MediatorLiveData<RatedProduct>只有在检索到所有数据而不是其中一个时才应该更新。

这就是我所拥有的(或多或少没有)。LiveData<RatedProduct> getRatedProductLiveData() 我猜有趣的部分是:

作为附加提示:数据库是 Firebase RealTimeDatabase,如果这有帮助的话。

0 投票
1 回答
31 浏览

mvvm - 尽管正在观察 MediatorLiveData onChanged,但未调用它

在 NetworkBoundResource 文件中,直到 "Log.d(TAG, "init: called")" 行起作用,但是 results.addSource 不起作用,尽管我在我的 RestaurantViewModel 类中观察它,而另一个 MediatorLiveData 在 NetworkBoundResource 中观察结果在我的活动中被观察到。

如果我运行该应用程序,则不会发生任何事件。没有错误。很明显,缺少某些东西,但是我找不到它是什么。任何答案都会非常有帮助。提前谢谢你。

RestaurantViewModel.kt

}

RestaurantActivity.kt中的 subscribeObservers 函数

RestaurantRepository.kt中的 searchByRestaurantId 函数

网络绑定资源.kt

0 投票
0 回答
186 浏览

android - Android MediatorLiveData removeSource 不起作用

我在我的应用程序上使用 MVVM + LiveData + Dagger 2.27。我正在尝试同时调用 2 个 API。

我正在使用 MediatorLiveData 结合 2 个观察者

我在 Fragment 中观察是这样的:

它工作正常,但是当移动到另一个片段并按下自动调用的观察者并导致列表重复时,我这样removeSource调用

但它现在正在工作。所以我需要在完成任何想法后移除观察者?

0 投票
1 回答
37 浏览

android - 房间返回空白对象

我正在使用以下代码发布我的房间查询结果

但似乎返回的对象是空的。我猜我们需要观察 databaseImpl.findRepoById(id),而不是直接访问它,但由于它在视图模型中,我没有生命周期所有者分配给房间查询 livedata。

使用 Room 查询和更新中介实时数据的正确方法是什么?

0 投票
0 回答
46 浏览

android - 观察 MediatorLiveData 不会产生任何结果(附加观察者)

基本上,我使用 Retrofit 从这个API 中获取产品列表到 ProductsRepository 类中的 MediatorLiveData 中。但是,问题是,当我尝试观察 LiveData 时,我得到了空值。

这是我的代码片段:

产品资料库:

主视图模型

主要活动:

如果我调用 hasActiveObservers(),虽然我从 MainActivity 观察它,但它返回 false。

现在,假设我用 MutableLiveData 替换 MediatorLiveData 并像下面那样重构我的 ProductsRepository,我会得到预期的输出。

我不知道我是否成功地解释了我的问题。如果我需要提供更多详细信息或代码片段,请告诉我。

提前致谢

0 投票
1 回答
240 浏览

kotlin - 观察 MediatorLiveData 问题

我的(简化示例)中有以下LiveData变量:ViewModel

我正在尝试使用MediatorLiveData一个“流”数据连接到我的RecyclerView.

因此,我在 中也有以下代码,在ViewModel中可以观察到Fragment

..连同这个,也在ViewModel

这是Fragment观察站点列表的代码:

除了第一次观察时,它会触发六次,因此它会更新我的 RecylcerView 六次,这似乎是有效的——当这是一个大列表时,我认为这有点问题!

初始化后,它只会在 LiveData 发生任何变化时更新一次,所以没关系。

我不知道如何防止这种情况发生,没有在 Fragment 或 ViewModel 中保存一个列表来比较观察到的列表,这是我试图避免的(试图遵循 MVVM 架构)..

编辑:为清楚起见,我添加了 myRecyclerViewAdapter以显示该功能的setList作用:

0 投票
1 回答
1998 浏览

kotlin - LiveData 转换映射功能

最近我一直在学习 LiveData 上的转换方法

我知道我们可以使用maporswitchMap方法来转换 livedata。假设我们有类似下面的 Player 数据类

我们使用 map 方法将玩家 livedata 转换为 playerName livedata

我的问题是,在观察者函数中这样做有什么区别,因为它们都在主线程中运行?我的意思是,如果我们想获得 playerName,那么我们也可以在观察者函数中获得它。为什么我们声明第二个 LiveData 实例来获得它

我从本指南中获取了示例代码:https ://proandroiddev.com/livedata-transformations-4f120ac046fc

0 投票
1 回答
89 浏览

kotlin - Kotlin \ Android - LiveData 异步转换阻止以前的结果

所以我有一个 LiveData,我将它转换为一个需要一段时间才能执行的异步函数(有时需要 2 秒或 4 秒)。

有时调用需要很长时间,有时它真的很快(取决于结果)有时它是即时的(空结果)

问题是,如果我的 LiveData 中有 2 次连续发射,有时第一个结果需要一段时间才能执行,而第二个结果需要一点时间,然后它会在第一个之前显示第二个,然后用较早的计算,

我想要的是顺序效应。(有点像 RxJava concatMap)

如何防止第二个结果覆盖第一个结果?

0 投票
2 回答
237 浏览

android - 将两个 LiveData 合并为一个 Android

我需要结合这两个数据。它们都有自己的 Fragment、Dao、Model 和 Repository。两者都从不同的表返回不同的数据。

ItemFavourite 表存储 Item 和 ItemMoto 上面的表的 id。

这就是我尝试的方式。

从 Fragment 我观察到这样的数据:

我得到的唯一数据仅来自 Item 表。

0 投票
0 回答
39 浏览

android - MVVM 架构。从 Repository 进行 API 调用的最佳实践,没有泄漏并且不对多个 viewModel 使用相同的实时数据

我刚刚开始实现MVVM 架构

我有一个这样的存储库:

在视图模型中我有这个:

我的问题是,暴露的 liveDataConfigsSSOT可能会在另一个中使用Fragment,另一个可以调用 initConfigs() (假设使用其他值)但是因为 Repository 是一个单例,它会返回相同的 liveData 对象。我不想要那个。

一个解决方案是在每次调用时创建一个新的 liveData 对象,即

但是现在出现了2个问题

1.我需要重做这一行_shouldUpdateLiveData = Transformations.map(_configsLiveData, ::_mapShouldUpdate),因为 viewModel 中的 _configsLiveData 已更改

即是这样的:

这似乎是一个非常糟糕的做法,而且......如果我的布局(xml)检索并观察了 liveData 但是我用另一个实例替换了那个 liveData 实例,xml 将观察到永远不会被再次调用的东西

2.那不是意味着 LiveData 对象会被泄露吗?如果我为每次调用生成新的,假设用户按下一个按钮,我每次都进行 API 调用并每次生成一个新的 LiveData 对象,那么旧的会发生什么?!

需要帮助: 我找不到该场景的任何解决方案和最佳实践:使用相同的存储库进行 API 调用,使用存储库中的 liveData 将数据发送回“viewModel 调用者”,但不要为每个调用实例化 liveData ,而是以某种方式使用相同的,但是当从不同的视图模型进行调用时,不要使用相同的 liveData 调用。

所以,所以,令人困惑!

编辑

由于评论部分中的一些讨论,添加了 RetrofitBuilder