【问题标题】:Google Android Sample MVVM - Why do they use MediatorLiveData instead of passing LiveData with getter?Google Android Sample MVVM - 为什么他们使用 MediatorLiveData 而不是通过 getter 传递 LiveData?
【发布时间】:2019-01-04 18:19:42
【问题描述】:

我正在分析 Android 架构组件示例应用 (BasicSample)。如果只附加了一个源,他们为什么在DataRepository 类中使用MediatorLiveData

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&lt;List&lt;ProductEntity&gt; 并使用 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);

【问题讨论】:

  • 您错过了他们在将初始数据插入数据库之前有意过滤 DAO 排放。这就是您提到的 MediatorLiveData 所做的
  • Aaa OK :) 因此,如果我在第一次运行时不向数据库插入任何数据,我可以确定数据库是在第一次查询之前创建的,因此我可以使用标准 public LiveData&lt;List&lt;ProductEntity&gt;&gt; getProducts() { return mDatabase.productDao().loadAllProducts(); } 而无需创建Mediator?
  • 是的,那么您可以在没有中介的情况下使用标准 dao ;) 从技术上讲,如果您没有进行中介舞,您可以先准备一个空视图,然后在数据加载时加载数据由于 LiveData Room 集成而插入。这样调解员甚至都不是绝对必要的。

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2015-03-24
    • 1970-01-01
    • 2022-11-07
    • 2011-02-04
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    相关资源
    最近更新 更多