Google Android示例MVVM-为什么他们使用MediatorLiveData而不是使用getter传递LiveData?

时间:2019-01-04 18:19:43

标签: android android-livedata android-architecture-components

我正在分析Android体系结构组件示例应用程序( BasicSample )。如果只有一个来源,他们为什么在MediatorLiveData类中使用DataRepository

https://github.com/googlesamples/android-architecture-components/blob/master/BasicSample/app/src/main/java/com/example/android/persistence/DataRepository.java#L25-L31

mObservableProducts = new MediatorLiveData<>();

mObservableProducts.addSource(mDatabase.productDao().loadAllProducts(),
        productEntities -> {
            if (mDatabase.getDatabaseCreated().getValue() != null) {
                mObservableProducts.postValue(productEntities);
            }
        });

我认为他们应该只使用DAO的LiveData<List<ProductEntity>并使用getter方法对其进行简化:

public LiveData<List<ProductEntity>> getProducts() {
    return mDatabase.productDao().loadAllProducts();
}

他们如何处理其他DAO请求:

https://github.com/googlesamples/android-architecture-components/blob/master/BasicSample/app/src/main/java/com/example/android/persistence/DataRepository.java#L47-L61

public LiveData<List<ProductEntity>> getProducts() {
    return mObservableProducts;
}

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

public LiveData<List<CommentEntity>> loadComments(final int productId) {
    return mDatabase.commentDao().loadComments(productId);
}

public LiveData<List<ProductEntity>> searchProducts(String query) {
    return mDatabase.productDao().searchAllProducts(query);
}

同一问题与ProductListViewModel有关。他们再次仅使用一个来源创建了MediatorLiveData

https://github.com/googlesamples/android-architecture-components/blob/master/BasicSample/app/src/main/java/com/example/android/persistence/viewmodel/ProductListViewModel.java#L42-L46

mRepository = ((BasicApp) application).getRepository();
LiveData<List<ProductEntity>> products = mRepository.getProducts();

// observe the changes of the products from the database and forward them
mObservableProducts.addSource(products, mObservableProducts::setValue);

1 个答案:

答案 0 :(得分:0)

他们有意在将初始数据插入数据库之前过滤DAO排放。这就是您提到的MediatorLiveData所做的。

如果您不需要像他们一样等待“初始数据集”的加载,则可以抛开MediatorLiveData并直接使用mDatabase.productDao().loadAllProducts();