我试图在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变量以及为什么?
答案 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示例中一样保留引用。