ViewModel 没有观察任何数据它只是返回 Product 的 LiveData 对象,因此您可以观察 ProductFragment 中的数据
这就是 LiveData 在ProductFragment 中观察的方式,其中getObservableProduct() 方法在ViewModel 上调用,返回LiveData<ProductEntity>
// 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>from Repository
private final LiveData<ProductEntity> mObservableProduct;
mObservableProduct = repository.loadProduct(mProductId);
如果您深入挖掘,在DataRepository 中,LiveData<ProductEntity> 是从 DAO 获取的
public LiveData<ProductEntity> loadProduct(final int productId) {
return mDatabase.productDao().loadProduct(productId);
}
在 DAO 中,它只是返回由 RoomCompiler 实现的 LiveData<ProductEntity> 的 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 -> 片段