代码之家  ›  专栏  ›  技术社区  ›  AppiDevo

google android示例mvvm-为什么他们使用mediatorlivedata而不是使用getter传递livedata?

  •  0
  • AppiDevo  · 技术社区  · 6 年前

    我正在分析Android架构组件示例应用程序( 碱性样品 )为什么他们使用 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);
                }
            });
    

    我觉得他们应该用 LiveData<List<ProductEntity> 来自dao,用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 . 他们又创造了 中介livedata 只有一个来源。

    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 回复  |  直到 6 年前
        1
  •  0
  •   EpicPandaForce Jigar Joshi    6 年前

    他们有意在将初始数据插入数据库之前过滤dao发射。这就是您提到的mediatorlivedata所做的。

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

    推荐文章