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变量放在哪里,为什么?
我先回答你的一般性问题:
更一般地说,我应该将实例 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。
最后,在您的情况下,您可以像谷歌示例中一样保存参考。
| 归档时间: |
|
| 查看次数: |
1261 次 |
| 最近记录: |