【问题标题】:Android Architecture Components: How is LiveData in the repository observed by a ViewModelAndroid 架构组件:视图模型如何观察存储库中的 LiveData
【发布时间】:2018-03-19 19:24:36
【问题描述】:

我正在研究Android Architecture Components,我有点困惑。在sample 中,他们使用存储库并声明存储库数据源内的更改由 ViewModel 观察。我不明白数据源中的更改是如何推送到 ViewModel 的,因为我看不到 ViewModel 中将它们订阅到存储库的任何代码。类似地,片段观察 ViewModel 的 LiveData,但它们实际上订阅了 LiveData:

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

我在 ViewModel 中看不到任何类型的订阅来观察存储库。我错过了什么吗?

【问题讨论】:

  • 您可能还想查看以下有关使用 MVVM 和 LiveData 构建电影搜索应用程序的示例:digigene.com/…

标签: android mvvm viewmodel android-architecture-components android-livedata


【解决方案1】:

ViewModel 没有观察任何数据它只是返回 Product 的 LiveData 对象,因此您可以观察 ProductFragment 中的数据

这就是 LiveDataProductFragment观察的方式,其中getObservableProduct() 方法在ViewModel 上调用,返回LiveData&lt;ProductEntity&gt;

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

ViewModel 中的这个方法调用自 ProductFragment

public LiveData<ProductEntity> getObservableProduct() {
    return mObservableProduct;
}

ProductViewModel的构造函数中,成员变量mObservableProduct初始化如下,得到LiveData&lt;ProductEntity&gt;from Repository

private final LiveData<ProductEntity> mObservableProduct;
mObservableProduct = repository.loadProduct(mProductId);

如果您深入挖掘,在DataRepository 中,LiveData&lt;ProductEntity&gt;从 DAO 获取的

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

在 DAO 中,它只是返回由 RoomCompiler 实现的 LiveData&lt;ProductEntity&gt;SQL 查询。如您所见,DAO 使用注释处理器使用的 @Dao 注释,并在 ProductDao_Impl 类中编写 Dao 实现。

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

所以简而言之ViewModel 持有引用 到 Activity 或 Fragment 所需的所有数据。数据在 ViewModel 中被初始化,它可以在 Activity 配置更改中继续存在。因此,我们将其引用存储在 ViewModel 中。 在我们的例子中,LiveData 只是我们对象的包装,DAO 实现将其作为 Observable 对象返回。所以我们可以在任何 Activity 或 Fragment 中观察到这一点。因此,一旦在数据源更改数据,它就会在 LiveData 上调用 postValue() 方法,我们得到 callback

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

【讨论】:

    猜你喜欢
    • 2020-03-16
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 2019-11-18
    • 1970-01-01
    相关资源
    最近更新 更多