在像这样在 Activity/Fragment 中观察它之前,您需要在 ViewModel 中初始化 LiveData 对象
ProductViewModel.java
public ProductViewModel(DataRepository repository, int productId) {
mObservableProduct = repository.loadProduct(mProductId);
}
public LiveData<ProductEntity> getObservableProduct() {
return mObservableProduct;
}
这里 observableProduct 是 LiveData 用于观察在构造函数中初始化并使用 getObservableProduct() 方法获取的产品详细信息
然后你可以像这样观察 Activity/Fragment 中的 LiveData
MainActivity.java
productViewModel.getObservableProduct().observe(this, new Observer<ProductEntity>() {
@Override
public void onChanged(@Nullable ProductEntity productEntity) {
mProduct = productEntity;
}
});
由于您已经设置了像 LiveData 流这样的代码架构
DAO -> 存储库 -> ViewModel -> 片段
您无需在存储库中观察 LiveData,因为您无法从那里更新 UI。而是从 Activity 观察它并从那里更新 UI。
正如您所说,它在 getValue() 上给出 null,请确保您正在更新 db 并按照我使用 DAO 的方式从单个 DAO 实例中获取 db 它不会使用 LiveData 通知一个 DAO 实例到第二个 DAO 实例的 db 更新
您也可以按照@Martin Ohlin 的建议观察Forever,但它不会感知生命周期并可能导致崩溃。在永久观察之前检查您的要求
有关完整的 LiveData 流程,请参阅此内容
有关DAO 问题,请参阅this
编辑 1 - 不使用 LifecycleOwner
您可以使用void observeForever (Observer<T> observer)
(参考)方法来观察 LiveData ,而无需LifecycleOwner
像我在上面示例中使用此上下文提供的那样提供任何内容。
这就是您可以在不提供任何 LifecycleOwner 的情况下观察 LiveData 并观察存储库本身中的 LiveData 的方式
private void observeForeverProducts() {
mDatabase.productDao().loadAllProducts().observeForever(new Observer<List<ProductEntity>>() {
@Override
public void onChanged(@Nullable List<ProductEntity> productEntities) {
Log.d(TAG, "onChanged: " + productEntities);
}
});
}
但是您需要removeObserver(Observer)
显式调用以停止观察 LiveData,这在以前的情况下使用 LifecycleOwner 自动完成。所以根据文档
您应该手动调用removeObserver(Observer)
以停止观察此 LiveData。虽然 LiveData 有一个这样的观察者,但它会被认为是活跃的。
由于这不需要 LifecycleOwner,因此您可以在 Repository 中调用它,而无需使用您提到的存储库中缺少的此参数