ViewModel中的实例成员LiveData变量?

时间:2018-06-11 09:43:07

标签: android mvvm android-room android-livedata android-viewmodel

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

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

第一个变种:

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

第二种变体:

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;

    }
    ...
  }

两种变体的存储库:

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<Score> score ;
ViewModel中的

?更一般地说,我应该在哪里放置实例LiveData / MutableLiveData变量以及为什么?

1 个答案:

答案 0 :(得分:1)

我先回答你的一般问题:

  

更一般地说,我应该把实例放在哪里   LiveData / MutableLiveData变量以及为什么?

简短的答案取决于它。通常,如果您只使用LiveData,则会将来自您的存储库的LiveData直接传递给ViewModel,而ViewModel只会将其公开给View,而无需在ViewModel中创建它的实例。

但是,如果由于任何原因您需要在ViewModel中修改LiveData,您应该在ViewModel中保留对它的引用,您可以在google sample中清楚地看到它:

 public LiveData<ProductEntity> loadProduct(final int productId) {
        return mDatabase.productDao().loadProduct(productId);
    }

存储库只是获取房间库提供的LiveData并公开它。 View模型获取LiveData并将其公开给View:

public ProductViewModel(@NonNull Application application, DataRepository repository,
            final int productId) {
        super(application);
        mProductId = productId;
        mObservableProduct = repository.loadProduct(mProductId);
    }

public LiveData<ProductEntity> getObservableProduct() {
    return mObservableProduct;
}

如上所示,您可以保留结果LiveData的引用。但你可以将它直接传递给视图:

public LiveData<ProductEntity> getObservableProduct() {
    return repository.loadProduct(mProductId);
}

我最近看到的是,如果您正在使用Retrofit和远程存储库(甚至是Room),您可以使用RxJava(或Retrofit的本机回调),这样您就需要一个LiveData实例在您的ViewModel中。

所以区别在于,如果您只使用LiveData(从数据源到视图),可以在ViewModel中保存对实时数据的引用。如果你的工作只有你必须在视图模型中有一个LiveData。

最后在您的情况下,您可以像在Google示例中一样保留引用。