当前位置: 首页 > 知识库问答 >
问题:

Android架构组件:ViewModel如何观察存储库中的LiveData

陆信瑞
2023-03-14

我正在研究Android架构组件,我有点困惑。在这个示例中,它们使用一个存储库,并通过ViewModels观察存储库数据源中的更改。我不明白datasource中的更改是如何推送到ViewModels的,因为在ViewModels中看不到将它们订阅到存储库的任何代码。类似地,片段观察ViewModel的LiveData,但它们实际上订阅了LiveData:

 // Observe product data
    model.getObservableProduct().observe(this, new Observer<ProductEntity>() {
        @Override
        public void onChanged(@Nullable ProductEntity productEntity) {
            model.setProduct(productEntity);
        }
    });

我在ViewModels中看不到任何类型的订阅来观察存储库。我是不是漏掉了什么?

共有1个答案

庞意智
2023-03-14

ViewModel没有观察任何数据,它只是返回产品的LiveData对象,这样您就可以观察ProductFragment中的数据

这就是在ProductFragment中观察LiveData的方式,其中GetObservableProduct()方法调用ViewModel,该方法返回LiveData

// Observe product data
    model.getObservableProduct().observe(this, new Observer<ProductEntity>() {
        @Override
        public void onChanged(@Nullable ProductEntity productEntity) {
            model.setProduct(productEntity);
        }
    });

从ProductFragment调用的ViewModel中的此方法

public LiveData<ProductEntity> getObservableProduct() {
    return mObservableProduct;
}
private final LiveData<ProductEntity> mObservableProduct;
mObservableProduct = repository.loadProduct(mProductId);

如果深入研究,在DataRepository中,LiveData 是从DAO中获取的

public LiveData<ProductEntity> loadProduct(final int productId) {
    return mDatabase.productDao().loadProduct(productId);
}

在DAO中,它只是SQL查询,返回livedata ,这是由RoomCompiler实现的。可以看到,DAO使用@DAO注释,注释处理器使用它,并在productdao_impl类中编写DAO实现。

@Query("select * from products where id = :productId")
LiveData<ProductEntity> loadProduct(int productId);

因此,简而言之,ViewModel包含对活动或片段所需的所有数据的引用。数据在ViewModel中得到初始化,并且它可以在活动配置更改中存活下来。因此,我们将它的引用存储在ViewModel中。在我们的例子中,LiveData只是我们的对象的包装器,DAO实现将其作为一个可观察的对象返回。所以我们可以在任何活动或片段中观察到这一点。因此,一旦在数据源更改了数据,它就在LiveData上调用postvalue()方法,我们就得到了回调

LiveData DAO流->存储库->ViewModel->片段

 类似资料:
  • 此外,为什么Viewmodel不能观察到它自己的LiveData的变化?

  • 对于LiveData和MVVM架构,我完全是个新手。我想知道如何观察一个实时数据 我通过以下方式从我的房间数据库中获取实时数据: 我希望ViewModel中的另一个变量,,在列表返回空(null)时进行更新。这将用于从Visible更新片段中的ImageView。去看电视了。看得见的 我如何检查如果是空的同步? 我四处阅读,看到一些人说使用,但是架构指南明确建议不要使用ViewModel中的任何观

  • 我有一个单独的类来处理数据提取(特别是Firebase),我通常从它返回LiveData对象并异步更新它们。现在我希望将返回的数据存储在ViewModel中,但问题是为了获得所述值,我需要观察从数据提取类返回的LiveData对象。observe方法需要一个LifecycleOwner对象作为第一个参数,但我的ViewModel中显然没有这个对象,而且我知道我不应该在ViewModel中保留对ac

  • 我正在使用匕首2,我有一个定义如下的: 这是FYViewModel的: 但是,变量始终为空。 如何使用匕首2将Repositroy注入我的ViewModel?

  • 我正在寻找在中观察数据的最佳方法。 我正在使用MVVM数据绑定。 存储库: 它从服务器请求数据并返回实时数据。ViewModel必须观察数据更改。 视图模型: ViewModel使用一个来观察来自存储库的的变化。我添加了数据作为源来观察变化,并在它触发后将其删除,以防止在我多次获取数据时多次触发事件。并且必须有一个虚假的观察者来观察,因此触发器的onChange方法。 比方说,我只需要数据来隐藏/

  • 我是一个新的Android开发人员,我正试图观察ViewModel中的布尔集。当应用程序启动时,我可以观察到它的初始状态,但以后应用的任何更改似乎都不会触发观察者(即当我切换片段时)。 下面是我的ViewModel的代码: 万事如意, 晶圆厂。