Android架构组件:ViewModel

时间:2017-12-18 10:40:24

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

我正在研究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);
        }
    });

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

1 个答案:

答案 0 :(得分:6)

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

中的数据

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

// 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<ProductEntity>

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

如果你深入挖掘,在DataRepository中,从{DAO

获取<{1}}
LiveData<ProductEntity>

在DAO中只有 SQL查询,它返回由 RoomCompiler 实现的public LiveData<ProductEntity> loadProduct(final int productId) { return mDatabase.productDao().loadProduct(productId); } 。正如你可以看到DAO使用@Dao注释,注释处理器和Write {Dao实现在LiveData<ProductEntity>类中使用。

ProductDao_Impl

因此,在简介中, ViewModel持有参考以获取Activity或Fragment所需的所有数据。数据在ViewModel中初始化,并且可以在活动配置更改后继续存在。因此,我们将其引用存储在ViewModel中。 在我们的例子中,LiveData只是我们的对象的包装,它由DAO实现作为Observable对象返回。所以我们可以在任何活动或片段中观察到这一点。因此,只要在数据源中更改了数据,它就会在LiveData上调用@Query("select * from products where id = :productId") LiveData<ProductEntity> loadProduct(int productId); 方法,我们会得到回调

LiveData的

流程 DAO - &gt;存储库 - &gt; ViewModel - &gt;片段