Android ViewModel中的实例成员LiveData变量?
在安卓上休息了几年后,我试图了解安卓架构组件。在阅读了官方文档和一些博客之后,有一件事让我感到困惑,那就是在哪里创建LiveData变量 在下面的第一个变量中,我仅在repository类中创建了livedata变量,在这两个类中的第二个变量中都创建了livedata变量 存储库和视图模型类。两种变体都有效 第一种变体:Android ViewModel中的实例成员LiveData变量?,android,mvvm,android-room,android-livedata,android-viewmodel,Android,Mvvm,Android Room,Android Livedata,Android Viewmodel,在安卓上休息了几年后,我试图了解安卓架构组件。在阅读了官方文档和一些博客之后,有一件事让我感到困惑,那就是在哪里创建LiveData变量 在下面的第一个变量中,我仅在repository类中创建了livedata变量,在这两个类中的第二个变量中都创建了livedata变量 存储库和视图模型类。两种变体都有效 第一种变体: public class ScoreViewModel extends AndroidViewModel { private ScoreRepositorDB sco
public class ScoreViewModel extends AndroidViewModel {
private ScoreRepositorDB scoreRepo;
public ScoreViewModel(Application application) {
super(application);
scoreRepo = new ScoreRepositorDB(application);
}
public LiveData<Score> getScore(){
return scoreRepo.getScore();
}
...
}
公共类ScoreViewModel扩展了AndroidViewModel{
私人ScoreRepositorDB scoreRepo;
公共ScoreViewModel(应用程序){
超级(应用);
scoreRepo=新的ScoreRepositorDB(应用程序);
}
公共LiveData getScore(){
返回scoreRepo.getScore();
}
...
}
第二种变体:
public class ScoreViewModel extends AndroidViewModel {
private ScoreRepositorDB scoreRepo;
private LiveData<Score> score ;
public ScoreViewModel(Application application) {
super(application);
scoreRepo = new ScoreRepositorDB(application);
score = scoreRepo.getScore();
}
public LiveData<Score> getScore(){
// return scoreRepo.getScore();
return score;
}
...
}
公共类ScoreViewModel扩展了AndroidViewModel{
私人ScoreRepositorDB scoreRepo;
私有LiveData评分;
公共ScoreViewModel(应用程序){
超级(应用);
scoreRepo=新的ScoreRepositorDB(应用程序);
score=scoreRepo.getScore();
}
公共LiveData getScore(){
//返回scoreRepo.getScore();
返回分数;
}
...
}
这两种变体的存储库:
private LiveData<Score> score ;
ScoreRepositorDB(Application application) {
ScoreRoomDatabase db = ScoreRoomDatabase.getDatabase(application);
scoreDao = db.scoreDao();
score = scoreDao.getScore(1);
}
public LiveData<Score> getScore(){
return score;
}
...
private-LiveData评分;
ScoreRepositorDB(应用程序){
ScoreRoomDatabase db=ScoreRoomDatabase.getDatabase(应用程序);
scoreDao=db.scoreDao();
score=scoreDao.getScore(1);
}
公共LiveData getScore(){
返回分数;
}
...
在本例中,我应该创建:
private LiveData<Score> score ;
private-LiveData评分;
在ViewModel中?更一般地说,我应该将实例LiveData/MutableLiveData变量放在哪里?为什么?我将首先回答您的一般问题: 更一般地说,我应该把例子放在哪里 LiveData/MutableLiveData变量及其原因 简而言之,这要视情况而定。通常,如果您只使用LiveData,您会将来自存储库的LiveData直接传递到ViewModel,而ViewModel只会将其公开给视图,而无需在ViewModel中创建实例 但是,如果出于任何原因,您需要在ViewModel中修改LiveData,您应该在ViewModel中保留对它的引用,您可以清楚地看到:
public-LiveData-loadProduct(最终int-productId){
返回mDatabase.productDao().loadProduct(productId);
}
存储库只是获取房间库提供的LiveData并将其公开。视图模型,获取LiveData并将其公开给视图:
public ProductViewModel(@NonNull Application application, DataRepository repository,
final int productId) {
super(application);
mProductId = productId;
mObservableProduct = repository.loadProduct(mProductId);
}
public LiveData<ProductEntity> getObservableProduct() {
return mObservableProduct;
}
公共产品视图模型(@NonNull应用程序、数据存储库、,
最终int产品ID){
超级(应用);
MPProductId=productId;
mObservableProduct=repository.loadProduct(mProductId);
}
公共LiveData getObservableProduct(){
退货服务产品;
}
您可以保持对result LiveData的引用,如上所示。但你可以直接把它传递给视图:
public LiveData<ProductEntity> getObservableProduct() {
return repository.loadProduct(mProductId);
}
public LiveData getobservedproduct(){
返回repository.loadProduct(mProductId);
}
我最近看到的是,如果您正在使用改型和远程存储库(甚至是Room),那么您可以使用RxJava(或改型的本机回调),这样您就需要在ViewModel中使用LiveData实例
因此,不同之处在于,如果您仅使用LiveData(从数据源到视图),则可以在ViewModel中保存对实时数据的引用。如果只进行了一半的工作,则视图模型中必须有一个LiveData
最后,在您的情况下,您可以像在google示例中一样保留引用。谢谢Levi。我需要时间来试验和理解你的想法。
public LiveData<ProductEntity> getObservableProduct() {
return repository.loadProduct(mProductId);
}