从你的数据源或存储库中暴露LiveData是使你的架构更具反应性的一个简单方法,但也有一些潜在的陷阱。...One-to-many dependency — MediatorLiveData MediatorLiveData允许你将一个或多个数据源添加到一个LiveData观察器中。...不一定:这个类可能有多个消费者。例如,考虑这个场景。...即使你认为你只是从一个消费者那里使用这个类,你也可能因为使用这种模式而最终出现错误。例如,当从一个Activity的一个实例导航到另一个实例时,新的实例可能会暂时收到来自前一个实例的数据。...你可以存储一个对源的引用,然后在添加新的源之前将其删除。(Spoiler: this is what Transformations.switchMap does!
架构库版本:1.0.0 Alpha 2 – June 2, 2017 LiveData 是一个数据持有者类,它持有一个值并允许观察该值。...LiveData 是生命周期感知的事实给我们提供了一个新的可能:可以在多个 activity,fragment 等之间共享它。...LiveData 的转换 有时候可能会需要在将 LiveData 发送到观察者之前改变它的值,或者需要更具另一个 LiveData 返回一个不同的 LiveData 实例。...;LiveData user = Transformations.switchMap(userId, id -> getUser(id) ); 使用这些转换允许在整个调用链中携带观察者的 Lifecycle...MediatorLiveData 需要特别注意正确的向源 LiveData 传递其处于活动/闲置状态。有关详细信息,请参阅 Transformations 类。
将LiveData解耦,不和特定的Activity或Fragment绑定在一起。 创建 观察LiveData 的对象 有了数据源之后,总需要有观察者来观察数据源,不然数据源就失去了存在的意义。...那么在哪里观察数据源呢? 在大多数情况下,在应用组件的onCreate()方法中访问LiveData是个合适的时机。...由于LiveData可以在多个Activity、Fragment和Service中使用,所以可以创建单例模式。...合并多个LiveData 源 MediatorLiveData是LiveData的子类,它主要用途是用来合并多个LiveData源。...当其中一个源数据发生变化是,都会回调订阅MediatorLiveData的观察者的onChanged()方法。例如我们在实际开发中,我们的数据源要么来自服务器,要么来自本地数据库。
switchMap的转换可能有点棘手,所以让我们从一个简单的例子开始。我们想为Player实现一个基本的搜索功能。每次搜索文本发生变化时,我们都想更新搜索结果。下面的代码显示了它是如何工作的。...我在调解器创建时调用了更新函数,只有在两个源都是非空的情况下才会发出一个值。这种模式非常通用,但让我们一个一个地走完每一步。 方案1 在从这个LiveData发出任何东西之前,你想监控哪些源的变化。...这可以只是一个单一的源(或更多),但没有固定的上限。...(即让你对单个LiveData进行条件映射或合并多个LiveDatas) 方案2 如果你想在创建MediatorLiveData时设置一个初始值,在这里调用内部更新函数。...原文链接:https://proandroiddev.com/livedata-transformations-4f120ac046fc
LiveData LiveData是一个与Activity/Fragment生命周期相关(lifecycle-aware)的Observer类。...合理的Configuration改变 旋转时候,它会立马接收到最新的可用数据,而不会因为重新创建Activity而重新创建 共享资源 可以通过继承一个LiveData对象,并且使用单例模式来封装一个系统的...MediatorLiveData:多来源的LiveData 它可以对一个数据结构添加多个数据来源,addSource函数添加LiveData类型的数据来源,而后回调给MediatorLiveData达到多路数据源的效果...(userLiveData, user -> { user.name + " " + user.lastName }); Transformations.switchMap private LiveData... getUser(String id) { ...; } LiveData userId = ...; LiveData user = Transformations.switchMap
3.LiveData对象具有感知生命周期的能力意味着您可以在多个Activity,Fragment和service之间共享它们。...-> { user.name + " " + user.lastName }); Transformations.switchMap() 与map()类似,使用一个函数来转换存储在LiveData...合并多个LiveData源 MediatorLiveData是LiveData的一个子类,帮助您合并多个LiveData源。...在任何原始LiveData源对象改变后,MediatorLiveData对象的Observer会被触发。 ...例如,如果在UI中有一个从本地数据库或网络获取更新的LiveData对象,则可以将以下数据源添加到MediatorLiveData对象: 与存储在数据库中的数据关联的LiveData对象。
这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。 拆解开来: LiveData是一个数据持有者,给源数据包装一层。....setValue("liveData3"); liveData4.setValue("liveData4"); liveData3、liveData4是两个数据源,有一个判断条件来决定...(Transformations对LivaData这两个用法和Rxjava简直一毛一样) 2.3.3 观察多个数据 - MediatorLiveData MediatorLiveData 是 LiveData...的子类,允许合并多个 LiveData 源。...: 与存储在本地数据库中的数据关联的 liveData5 与从网络访问的数据关联的 liveData6Activity 只需观察 MediatorLiveData 对象即可从这两个源接收更新。
第一步就这么简单,接下来看第二步 2.2 LiveData 现在我们在ViewMode中调用上面的getAll方法获取所有的文章信息,并且将返回的数据封装成一个LiveData,具体如下: class...一个基于Paging的Database列表已经完成,是不是非常简单呢?...如果需要完整代码可以查看下面的Github链接 https://github.com/idisfkj/android-api-analysis 3 自定义DataSource 上面是通过Room来获取数据...至于这两个方法的具体实现,其实没什么多说的,根据你的业务要求来即可,这里要说的是,数据获取完毕之后要回调方法第二个参数callback的onResult方法。...val loadStatus: LiveData, val refreshStatus: LiveData<LoadStatus
Using a data repository 正如在《应用程序架构指南》中看到的那样,大多数应用程序都有多个数据源,例如。...建议有一个单独的存储库类作为处理这种复杂性的单一入口。 如果你有多个非常不同的数据模型,可以考虑添加多个存储库。...使用Transformations是解决这个问题的一个非常方便的方法。Transformations.switchMap让你创建一个新的LiveData,对其他LiveData实例的变化做出反应。...LiveData repo = Transformations.switchMap(repoIdLiveData, repoId -> { if (repoId.isEmpty...原文链接:https://medium.com/androiddevelopers/viewmodels-and-livedata-patterns-antipatterns-21efaef74a54
一、 LiveData简介 LiveData是Jetpack架构组件Lifecycle 库的一部分,是一个可感知生命周期的可观察容器类 (Observable)。...并继承自LiveData,并重写了onActive和onInactive两个重要方法。...由于LiveData可以在多个Activity、Fragment和Service中使用,所以可以创建单例模式。...有时候,我们希望在把数据分发给观察者之前进行一些处理,或者返回一个基于已有值的LiveData对象的另外一个LiveData对象,此时就会用到 Transformations类。...转化LiveData时需要用到Transformations.map()和Transformations.switchMap()等方法。
数据源,或者调度多个 LiveData 数据源决定向观察者发送那个 LiveData 的数据更新。...它新增了两个方法 addSource 、removeSource 用于添加和删除 LiveData 源 Observer: 观察者接口,通过该接口对 LiveData 数据进行观察 2、详细使用 MutableLiveData...他们的作用都是将一个 LiveData 转换为另一个 LiveData 对象,当一个 LiveData 里的值发生改变时另一个 LiveData的值也随之发生改变。...MediatorLiveData 继承自 MutableLiveData 可以添加多个 LiveData 数据源,可以观察或调度多个 LiveData 数据源。...LiveData 源 userLiveData1 和 userLiveData2 ,当其中任意一个数据更新且在 userMediatorLiveData 的活跃生命周期内就会更新 userMediatorLiveData
第一步就这么简单,接下来看第二步 2.2 LiveData 现在我们在ViewMode中调用上面的getAll方法获取所有的文章信息,并且将返回的数据封装成一个LiveData,具体如下: class...一个基于Paging的Database列表已经完成,是不是非常简单呢?...如果需要完整代码可以查看下面的Github链接 https://github.com/idisfkj/android-api-analysis 3 自定义DataSource 上面是通过Room来获取数据...至于这两个方法的具体实现,其实没什么多说的,根据你的业务要求来即可,这里要说的是,数据获取完毕之后要回调方法第二个参数callback的onResult方法。...4 项目地址 Android精华录 该库的目的是结合详细的Demo来全面解析Android相关的知识点, 帮助读者能够更快的掌握与理解所阐述的要点 链接地址(或者点击阅读原文): https://github.com
原文地址:ViewModels and LiveData: Patterns + AntiPatterns 原文作者:Jose Alcérreca 译文出自:掘金翻译计划 本文永久链接:github.com...使用数据仓库(Data Repository) 就像 Guide to App Architecture(应用架构指南) 里说的那样,大多数 APP 有多个数据源,比如: 远程:网络、云端 本地:数据库...由于保持缓存和数据库与网络同步的算法通常很琐碎复杂,所以建议为每个仓库创建一个类作为处理同步的单一入口。 如果是许多种并且差别很大的数据模型,考虑使用多个数据仓库。...Transformations.switchMap 允许你创建响应其他 LiveData 实例的改变的 LiveData ,它还允许在调用链上传递观察者的生命周期信息: LiveData repo...= Transformations.switchMap(repoIdLiveData, repoId -> { if (repoId.isEmpty()) {
Connect Kotlin Coroutine to LiveData 如果我们有一个需要调用的coroutine,以获取一些数据到LiveData,我们可以做以下工作。...在内部对于asLiveData实际上也是一个LiveData {...}。...val liveData: LiveData = Transformations.switchMap(sourceliveData) { liveData(viewModelScope.coroutineContext...Connecting Multiple LiveData Source Emission 在这种情况下,我们有多个LiveDatas源数据,我们想控制数据输出的逻辑,我们也可以使用Coroutine Builder...该代码块在LiveData变得活跃时开始执行,当LiveData变得不活跃时,在一个可配置的超时后自动取消。如果它在完成之前被取消,那么如果LiveData再次变得活跃,它将被重新启动。
LiveData 概述 LiveData 是一个可观察数据包装类,与普通观察者不同,LiveData 具备生命周期感知能力,这意味着它遵循其它应用组件的生命周期(Activity、Fragment、Service...LiveData 对象连接到系统服务一次,然后任何需要该资源的观察者都可以只观看 LiveData 对象 使用 LiveData 使用 LiveData 的常规步骤如下,我们按照下面这些步骤写一个简单的例子...你可以通过 removeObserver(Observer) 方法删除观察者 1、创建一个 LiveData LiveData 是一个包装器,可以包装任何数据,包括实现集合的对象,例如 List。...或者您可能需要根据另一个 LiveData对象的值返回不同的 LiveData 实例。.... } val userId: LiveData = ... val user = Transformations.switchMap(userId) { id -> getUser(id
为了解决这个问题,LiveData提供了两个方法,分别为onActive()与onInactive()。...我们可以在多个界面中使用StockLiveData进行添加observer。例如在Activity中,只要有一个observer,那么它将一直监听数据的变化。...案例:对于App统计需求,一旦涉及到多个页面间的统计参数传递,可以自定义一个扩展LiveData来全局监听参数的传递与变化。...> user = Transformations.switchMap(userId, id -> getUser(id) ); MediatorLiveData 与LiveData相关的还有一个MediatorLiveData...,它的作用是:可以同时监听多个LiveData。
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。...分页库支持加载有限以及无限的list,比如一个持续更新的信息源,分页库可以与RecycleView无缝集合,它还可以与LiveData或RxJava集成,观察界面中的数据变化。 ?...DataSource DataSource 顾名思义就是数据源,它是一个抽象类,其中Key对应加载数据的条件信息,Value对应加载数据的实体类。...val retry: () -> Unit) Listing是我们封装的一个数据类,将数据源、网络状态、刷新状态、下拉刷新操作以及重试操作都封装进去了。...-> finish() } return super.onOptionsItemSelected(item) } } ViewModel中的gankList是一个LiveData
例如,当你在开始数据加载操作之前,你需要一个ID参数。有一个方便的模式,那就是使用Transformations.switchMap。...Emit all items from another LiveData 这个功能不太常见,但也可以节省一些模板代码:你可以使用emitSource传递一个LiveData数据源。...它们只运行一次,可以返回一个结果 返回多个值的操作。...对一个数据源的订阅,可以在一段时间内发出多个值 One-shot operations with coroutines 使用suspend函数并使用viewModelScope或liveData{}...1 initial value + N values from data source 如果数据源暴露了一个LiveData,我们可以使用emitSource在用emit发射一个初始值后进行批量更新。
二、LiveData实现全局定时器 场景 一个全局计数器,Activity销毁时,计时器停止,不会导致内存泄露,Activity激活时,计时器开始,自动获取最新的计时。...sInstance.isInitialized) sInstance else TimerGlobalLiveData() return sInstance } } } 三、共享数据 场景 多个...场景 Activity中有一个EndTripView自定义View,这个自定义View中有很多的小view,最右下角是一个按钮,点击按钮,调用结束行程的网络请求。...user -> "${user.name} ${user.lastName}" } 摘自官方文档:developer.android.com/topic/libra… 此外,还有一种转换方式:Transformations.switchMap...十一、合并多个LiveData数据源 场景 如果界面中有可以从本地数据库或网络更新的 LiveData 对象,则可以向 MediatorLiveData 对象添加以下源: 与存储在数据库中的数据关联的
这里使用 LiveData 和 ViewModel 实现了一个简单的 MVVM:数据的变化能够自动通知 View 然后做出相应的 UI 改变,并且能在 Activity 生命周期结束前停止监听 二、认识...LiveData val uiModel: LiveData = Transformations.switchMap(UserRepo.userData, Function...:observer 的生命周期是可以传递到新的 LiveData 中的,也就是当 observer 生命周期销毁的时候,两个 LiveData 的监听关系都会断开,这在 ViewModel 和 Repo...() 实际上内部都是用了一个叫 MediatorLiveData 的封装类,使用这个类可以将多个 LiveData 组合起来,实现监听多个 LiveData 变化的功能 image.png 例如上图我们的... = Transformations.switchMap( UserRepo.userData, Function { user
领取专属 10元无门槛券
手把手带您无忧上云