当前位置: 首页 > 知识库问答 >
问题:

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

曾修真
2023-03-14

我在分析Android架构组件示例应用程序(BasicSample)。如果只有一个源附加到DataRepository类,为什么要在MediatorLiveData中使用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 <list,并使用getter方法进行简化:

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

它们是如何处理其他DAO请求的:

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.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个答案

缪嘉志
2023-03-14

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

如果您不需要像它们那样等待“初始数据集被加载”,那么您只需放弃MediatorLiveData并直接使用mdatabase.productdao().loadallproducts();

 类似资料:
  • 问题内容: 我正在阅读Java JDBC规范(版本4),并且遇到了以下语句: DataSource-此接口在JDBC 2.0可选软件包API中引入。它优于DriverManager,因为它允许有关基础数据源的详细信息对应用程序透明 我想了解的是a 和a 之间的区别以及它为什么存在。我的意思是,上面的代码块说关于数据源的详细信息对于应用程序是透明的,但是是否不会在属性文件中外部化数据库属性(例如用户

  • 我试图理解的是和之间的区别,以及它存在的原因。我的意思是,上面的块表明关于数据源的细节对应用程序是透明的,但是在属性文件中外部化数据库属性如用户名、密码、url等,然后使用DriverManager是否会以同样的方式工作? 创建接口是否只是为了有一种返回可以池化的连接的通用方式?在Java EE中,应用程序服务器是否实现了这个接口,并且部署的应用程序是否具有对数据源的引用而不是连接?

  • 我正在学习亚当·简斯的合唱团教程。 数据是用这个代码块加载的 而准备就绪被定义为 我把这个序列理解为 首先-创建一个名为promises的数组,其中第一项是来自此链接的已解析json,第二项是来自该文件的id/值对的映射 第二,获取promise变量中的所有promise,如果成功,则触发函数ready,如果失败,则不执行任何操作 如果这是对的,那么相对于这样的东西有什么优势呢?我用伪代码写这个因

  • 在我的gcloud控制台中,我定义的入口显示以下错误: 同步期间出错:评估入口规范时出错:服务“monitoring/kube prometheus”类型为“ClusterIP”,应为“NodePort”或“LoadBalancer” 我使用traefik作为反向代理(而不是nginx),因此我使用集群IP定义入口。据我所知,所有流量都是通过traefik服务(定义了负载均衡器入口)代理的,因此我

  • 很多人问了此问题,说bzero已经被posix-2008废弃,为何还使用bzero。选择bzero而不是memset,有2个原因: bzero有2个参数,指针和长度,很明确就是将制定size的内存初始化为0。而memset有3个参数,需要记忆参数的位置,有不少人经常把长度和初始化值搞错。 bzero比memset的可读性要好。memset可以制定初始化的值,实际上绝大多数情况都是0。 一旦新版本g

  • 问题内容: 对于有关辅助程序/实用程序类的这些简单问题,我从未找到好的答案: 为什么我要创建一个单例(无状态)而不使用静态方法? 如果对象没有状态,为什么需要一个对象实例? 问题答案: 通常,单例用于向应用程序引入某种 全局状态 。(说实话,通常不是很必要,但这是另一个话题。) 但是,在一些极端情况下,甚至 无状态 单例也可能有用: 您希望在可预见的将来用状态扩展它。 由于某些特定的 技术 原因,