ViewModel中的实例成员LiveData变量?

u2g*_*les 5 android mvvm android-room android-livedata android-viewmodel

在Android上中断两年后,我试图了解Android体系结构组件。在阅读官方文档和一些博客后,令我困惑的一件事是在哪里创建LiveData变量。

在下面的第一个变体中,我仅在存储库类中创建了一个livedata变量,而在存储库和View模型类的第二个变体中创建了一个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();   
    }
    ...
 }
Run Code Online (Sandbox Code Playgroud)

第二个变体:

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;

    }
    ...
  }
Run Code Online (Sandbox Code Playgroud)

两种版本的存储库:

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;
}
...
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我应该创建:

 private LiveData<Score> score ;
Run Code Online (Sandbox Code Playgroud)

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

Lev*_*ira 1

我先回答你的一般性问题:

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

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

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

 public LiveData<ProductEntity> loadProduct(final int productId) {
        return mDatabase.productDao().loadProduct(productId);
    }
Run Code Online (Sandbox Code Playgroud)

存储库只是获取 Room 库提供的 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;
}
Run Code Online (Sandbox Code Playgroud)

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

public LiveData<ProductEntity> getObservableProduct() {
    return repository.loadProduct(mProductId);
}
Run Code Online (Sandbox Code Playgroud)

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

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

最后,在您的情况下,您可以像谷歌示例中一样保存参考。