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中看不到任何类型的订阅来观察存储库.我错过了什么吗?
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
| 归档时间: |
|
| 查看次数: |
2321 次 |
| 最近记录: |