Android ViewModel中的实例成员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

在安卓上休息了几年后,我试图了解安卓架构组件。在阅读了官方文档和一些博客之后,有一件事让我感到困惑,那就是在哪里创建LiveData变量

在下面的第一个变量中,我仅在repository类中创建了livedata变量,在这两个类中的第二个变量中都创建了livedata变量 存储库和视图模型类。两种变体都有效

第一种变体:

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);
}