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

Mar*_*Who 1 android mvvm viewmodel android-livedata android-architecture-components

我正在研究Android架构组件,我有点困惑.在示例中,他们使用存储库并声明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);
        }
    });
Run Code Online (Sandbox Code Playgroud)

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

adi*_*e49 7

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

这就是在ProductFragment中观察LiveData的方式,其中调用ViewModel 的方法返回getObservableProduct()LiveData<ProductEntity>

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

ViewModel中的此方法从ProductFragment调用

public LiveData<ProductEntity> getObservableProduct() {
    return mObservableProduct;
}
Run Code Online (Sandbox Code Playgroud)

ProductViewModel的构造函数中,成员变量mObservableProduct初始化如下,从Repository获取LiveData<ProductEntity>

private final LiveData<ProductEntity> mObservableProduct;
mObservableProduct = repository.loadProduct(mProductId);
Run Code Online (Sandbox Code Playgroud)

如果你深入挖掘,在DataRepository中,LiveData<ProductEntity>从DAO获取的

public LiveData<ProductEntity> loadProduct(final int productId) {
    return mDatabase.productDao().loadProduct(productId);
}
Run Code Online (Sandbox Code Playgroud)

在DAO中它只是返回由RoomCompiler实现的SQL查询.正如你可以看到DAO使用@Dao注释,它由注释处理器和类中的Write Dao实现使用.LiveData<ProductEntity>ProductDao_Impl

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

所以在一个概括地说,视图模型保持引用于所有由活动或片段所需的数据.数据在ViewModel中初始化,并且可以在Activity 配置更改中生效.因此,我们将其引用存储在ViewModel中.在我们的例子中,LiveData只是我们的对象的包装,它由DAO实现作为Observable对象返回.所以我们可以在任何Activity或Fragment中观察到这一点.因此,只要在数据源上更改数据,它就会postValue()在LiveData上调用方法,然后我们得到回调

LiveData DAO 流程- >存储库 - > ViewModel - > Fragment