在使用 Android 几年后,我试图了解 Android 架构组件。阅读官方文档和一些博客后,让我感到困惑的一件事是在哪里创建 LiveData 变量。
在下面的第一个变体中,我只在存储库类中创建了一个 livedata 变量,而在两个变体中的第二个变体中 存储库和 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 变量放在哪里,为什么?
最佳答案
我先回答你的一般问题:
And more generally , where should I put instance LiveData/MutableLiveData variable and why?
简短的回答是视情况而定。通常,如果您只使用 LiveData,您会将来自存储库的 LiveData 直接传递给 ViewModel,而 ViewModel 会简单地将它公开给 View,而无需在 ViewModel 中创建它的实例。
但是,如果出于任何原因您需要修改 ViewModel 中的 LiveData,您应该在 ViewModel 中保留对它的引用,您可以在这个 google sample 中清楚地看到它。 :
public LiveData<ProductEntity> loadProduct(final int productId) {
return mDatabase.productDao().loadProduct(productId);
}
存储库只是获取 Room Library 提供的 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 的引用,如上所示。但您可以直接将其传递给 View :
public LiveData<ProductEntity> getObservableProduct() {
return repository.loadProduct(mProductId);
}
我最近看到的是,如果您正在使用 Retrofit 和远程存储库(甚至是 Room),您可以使用 RxJava(或 Retrofit 的 native 回调),这样您就需要一个 LiveData 实例在你的 View 模型中。
所以不同之处在于,如果您只使用 LiveData(从数据源到 View ),您可以在 ViewModel 中保存对实时数据的引用。如果您只工作到一半,您必须在 View 模型中有一个 LiveData。
最后,在您的情况下,您可以像在 google 示例中一样保留引用。
关于android - ViewModel 中的实例成员 LiveData 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50794726/