首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android从零开始搭建MVVM架构(4)——LiveData

确保在ViewModel不是Activity或Fragment中保存用来更新UI的LiveData对象,原因如下: 避免臃肿的Activity和Fragment。...这些UI控制器负责显示数据不是保存数据状态。 将LiveData实例与特定Activity或Fragment实例分离,这将使得LiveData对象在配置更改后仍然存活。...除非Observer正在观看返回的LiveData对象,否则不会计算转换。 由于转换是延迟计算的,所以与生命周期相关的行为隐式传递,不需要额外的显式调用或依赖关系。...另外,如果UI组件被重新创建,它会触发对repository.getPostCode()方法的另一个调用,不是使用前一个调用的结果。   ...要实现自己的转换,您可以使用MediatorLiveData类,该类监听其他LiveData对象并处理它们发出的事件。 MediatorLiveData将其状态正确地传播到源LiveData对象。

2.2K30

Android Jetpack - LiveData

每次应用程序数据更改时,你的观察者都可以在每次更改时更新 UI,不是更新 UI 没有内存泄露 观察者绑定到 Lifecycle 对象,并在其相关生命周期被破坏后自行清理 不会因为活动停止崩溃 如果观察者的生命周期处于非活动状态...,例如在后端堆栈中的活动的情况下,则它不会收到任何 LiveData 事件 不再需要手动处理生命周期 UI 组件只是观察相关数据,不会停止或恢复观察。...LiveData 自动管理所有这些,因为它在观察时意识到相关的生命周期状态变化 始终保持数据最新 如果生命周期变为非活动状态,它将在再次变为活动状态时接收最新数据。...例如,后台活动在返回前台后立即接收最新数据 配置更改友好 如果由于配置更改(例如设备轮换)重新创建活动或片段,则会立即接收最新的可用数据 资源共享 你可以使用单例模式扩展 LiveData 对象以包装系统服务...UI 控制器在其处于活跃状态时立即显示数据,只要应用组件处于 STARTED 状态,它就会从它正在观察的LiveData 对象中接收最新值 class MainActivity : AppCompatActivity

2K30
您找到你想要的搜索结果了吗?
是的
没有找到

谷歌官方Android应用架构库——LiveData

一个处于活动状态的观察者时该方法被调用,这意味着需要开始从设备观察位置更新。...可以规范的管理它们,以便只有当它们中的任何一个可见(即处于活动状态)时才连接到系统服务。...转换的这种惰性运算性质允许隐式的传递生命周期相关行为,不必添加显式的调用或依赖。 每当你认为在 ViewModel 中需要一个 Lifecycle 类时,转换可能是解决方案。...此外,如果 UI 被重新创建,它将会触发新的 repository.getPostCode() 调用,不是使用之前的调用结果。 不能使用那种方式,而应该实现将地址输入转换为邮政编码信息。...可以使用 MediatorLiveData 实现自己的转换,MediatorLiveData 是为了用来正确的监听其它 LiveData 实例并处理它们发出的事件特别创建的。

1.1K30

干货 | 高耦合场景下,Trip.com如何做支付设计与落地

在前文中提到的,我们有Trip Coins、礼品卡和其他支付方式的混付,也有优惠券、服务费的再计算,这些使得我们的拆分并不能做到数据层面的完全隔离,所以需要再处理各base case间的数据流转问题。...与常规的可观察类不同,LiveData 具有生命周期感知能力,它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。...被设计为粘性事件,在页面状态由非活动状态转为活动状态时,会接收到最新数据,使得我们接收的数据始终保持最新状态; 在更新数据到视图时,不会因为此时activity处于停止状态发生crash; 在页面退出时...LiveData一个粘性事件,页面由非活动状态转到活动状态,只能收到最后一次的数据,导致前序数据丢失,某些业务场可能要求数据不丢失或非活动状态仍要接收数据,此时LiveData就不再满足需求。...我们可能在多个页面订阅了同一个LiveData,但是业务要求,仅在前台页面中一次处理该数据,其它页面无需再处理

67720

LiveData Coroutine Builder的5个诡计

Delay and Keep Coroutine Alive Temporarily 我们在liveData coroutine builder中的一个特殊功能是,它可以被配置为在LiveData活动的特定时间内保持...如果该块因任何其他原因被取消(例如抛出一个CancellationException),它不会被重新启动。 ❞ 如果我们看一下代码,我们会看到我们有timeoutInMs,它默认为5s。... = CoroutineLiveData(context, timeoutInMs, block) 这意味着,当我们把活动(观察LiveData)放在后台,并且活动在暂停/停止时(注意:不是不保留活动...如果coroutine在超时前完成,即使Activity还没有恢复,coroutine也不会被重新启动,只是发出它的最后一个值。...这为我们将两种技术结合在一起提供了更大的灵活性,即LiveData观察Android生命周期的能力,以及Kotlin Flor更好的反应式操作和线程处理

1.5K60

安卓开发中的Model-View-Presenter(MVP模式)

确实,在一段时间内,一个非常基础的MVP已经被提出来打破 God-Object (完全负责所有的事情),而且,就在不久之前,谷歌提出的MVVM,使用它的体系结构组件,正在被采用(ViewModel, LiveData...依赖项投资原则(DIP)只在一个方向得到了解(视图=>服务,不是服务=>视图)。这个问题是存在的,因为两个方向上的依赖关系的给了我们更大的内聚性和更少的耦合,但也增加了复杂性。...像这样,我们可以使用RxJava在我们的服务,所以我们可以操作数据与我们所有这个库提供的运营商和LiveData视图的一部分,这将使我们能够使一个实现,意识到我们的活动的生命周期的变化,甚至使用谷歌提供的视图模型...观察前端架构的演变,认为Android正在接近一个类似Redux的架构并不是不合理的。...另外,在我们必须处理适配器时,研究如何实现这种绑定也是我们目前正在研究的一个挑战。

1.6K30

带你了解LiveData重放污染的前世今生

你的观察者可以在每次应用数据变化(生命周期变化)时更新UI,不是在每次有变化时更新UI。 没有内存泄漏:观察者被绑定到生命周期对象,并在其相关的生命周期被销毁时进行自我清理。...不会因为Activity的销毁崩溃:如果观察者的生命周期处于非活动状态,例如在后堆栈中的活动,那么它就不会收到任何LiveData事件。...不再需要手动处理生命周期:UI组件只是观察相关的数据,不需要主动停止或恢复观察。LiveData会自动管理这一切,因为它在观察时就知道相关的生命周期状态变化。...Jose的解决方案缺乏对多个观察者的支持,而这正是LiveData以 "共享资源 "为名的承诺之一。 它不是线程安全的。 我还可以补充一个问题。...如果有任何其他问题,你可以直接提出拉动请求,说明我错了,错在哪里。另外,你可以通过Maven导入库,不是复制/粘贴LiveEvent类,这样,一旦库的版本更新,任何错误修复都会出现在你的项目中。

1.2K10

LiveData的前世今生

例如:一个值可以在没有观察者活动的情况下被设置,所以新的观察者会直接取代它。另外,从不同的线程设置值可能会导致竞赛条件,只产生一个对观察者的调用。...你的观察者可以在每次应用数据变化(生命周期变化)时更新UI,不是在每次有变化时更新UI。 没有内存泄漏:观察者被绑定到生命周期对象,并在其相关的生命周期被销毁时进行自我清理。...不会因为Activity的销毁崩溃:如果观察者的生命周期处于非活动状态,例如在后堆栈中的活动,那么它就不会收到任何LiveData事件。...不再需要手动处理生命周期:UI组件只是观察相关的数据,不需要主动停止或恢复观察。LiveData会自动管理这一切,因为它在观察时就知道相关的生命周期状态变化。...Jose的解决方案缺乏对多个观察者的支持,而这正是LiveData以 "共享资源 "为名的承诺之一。 它不是线程安全的。 我还可以补充一个问题。

1.1K10

LiveData详细分析

c.LiveData 只在 LifecycleOwner active 状态发送通知,是怎么处理的? d.LiveData 会自动在 DESTROY 的状态下取消订阅,是怎么处理的?...e.生命周期变化后数据处理流程是怎么样的? f.为什么观察者只能与一个LifecycleOwner绑定,不是多个?...看了下面源代码可知,支持键值对存储,用链表实现,不是线程安全的。...活动,以保持它作为活动的入口。 // 因此,即使观察者移动到一个活动状态,如果我们没有收到那个事件,我们最好不要通知一个更可预测的通知顺序。 if (!...一个 owner 可以绑定多个 Observer 实例; LiveData 跟 LifecycleOwner 绑定,能感知生命周期变化,并且只会在 LifecycleOwner 处于 Active 状态

2.8K00

360度无死角,Android Jetpack面试技巧大揭秘

它的使用场景包括但不限于: 单一活动多Fragment架构: 通过将所有Fragment集中在一个活动中,简化了导航的管理和传递数据的复杂性。...参考简答: 其作用和核心组件包括: 作用: Navigation组件用于实现应用内的导航结构,使得从一个目的地(Destination)到另一个目的地的导航变得更加容易管理和统一。...参考简答: ViewModel的作用在于解决Android应用中活动和碎片(Fragment)的生命周期问题。它允许数据在屏幕旋转等配置更改时存活,并确保数据在不同组件之间共享不丢失。...背压处理: Observable在RxJava中通常使用背压策略来处理数据流,LiveData则通过生命周期感知来实现反应式响应,避免了背压问题。...与Jetpack集成: Hilt与其他Jetpack组件无缝集成,使得在使用其他Jetpack库时能够更加方便地进行依赖注入。

15810

【译】LiveData三连

后来,当你需要处理数据并在此基础上改变UI时,你会发现继续在活动中写代码,这样会更容易,因为它已经包含了所有需要更新的字段和UI元素。让我们来看看代码会是什么样子。...因为它们的生命周期不在我们的控制之下,它们可以在任何时候根据用户的互动或其他因素(如低内存)被销毁。如果我们在一个UI组件中创建和处理我们的数据,一旦该组件被销毁,我们所有的数据都会被销毁。...尽管你可以将一个函数作为参数不是UI组件本身传递,但在这里你也应该知道UI组件的生命周期,因为该函数通常会操作该组件的UI元素。...这就意味着不会再有因Activity停止导致的崩溃了。而且,由于LiveData的可观察性控制了事件的触发,我们就不需要手动处理生命周期。...如果你有一个实际的Stream,它可能发生背压的问题,那么LiveData就不能解决你的问题。原因是LiveData并不支持它。LiveData的目的是在观察者处于/进入活动状态时向UI推送最新的值。

1.6K20

事件总线方案实践

[image摘自网络] 具体使用可以看demo代码,demo开源地址 02.RxBus使用原理 RxBus不是一个库,而是一个文件,实现只有短短30行代码。...LiveData具有生命周期感知能力,所以LiveDataBus只需要调用注册回调方法,不需要显示的调用反注册方法。...活动,以保持它作为活动的入口。 // 因此,即使观察者移动到一个活动状态,如果我们没有收到那个事件,我们最好不要通知一个更可预测的通知顺序。 if (!...如果在这个 Runnable 执行前多次 postValue,其实只是改变暂存的值 mPendingData,并不会再次抛另一个 Runnable。...这带来了两个好处: 可以在任何位置订阅消息,不是必须在onCreate方法中订阅 避免了忘记取消订阅引起的内存泄漏 具体已经对lifecycle源码作出了分析,具体可以看我上一篇的博客。

1.8K30

生命周期感知 Lifecycle

例如,如果回调在保存活动状态后运行 Fragment 事务,那么它将触发崩溃,因此我们永远都不想调用该回调。 为了简化此用例,Lifecycle 类允许其他对象查询当前状态。...如果其他的 Activity 或者 Fragment 想使用它,只需要初始化它即可。其他所有操作都由 LocationListener 自己处理。...但并不是说让 ViewModel 类去获取数据,相反的应该让其他合适的组件去获取数据,ViewModel 类只是把结果提供给 UI 控制器。 使用数据绑定库维护视图和 UI 控制器的整洁。...详情参见: commit()) 如果观察者的关联生命周期至少不是 STARTED, LiveData 不会调用观察者,从而避免了这种极端情况。...这将创建一个可能较长的时间间隔,在该时间间隔中,即使无法修改其 UI 状态,观察者仍认为生命周期处于活动状态。

1.2K20

Android | LiveData 源码分析

前言 LiveData 是一种持有可被观察的数据存储类,和其他可被观察的类不同的是,LiveData 是就要生命周期感知能力的,这意味着他可以在 Activity ,fragment 或者 service...没有内存泄漏,因为关联了生命周期,页面销毁后会进行自我清理 不会因为Activity 停止导致崩溃,页面处于非活跃状态时,他不会接收到任何 LiveData 事件 数据始终保持最新状态,页面如果变为活跃状态...当生命周期发生变化后,就会回调到 LifecycleBoundObserve 中的 onStateChanged 方法中,如果是销毁了,就会移除观察者,如果不是就会循环更新当前状态。...其中: onActive 方法会在活动的观察者从 0 变成 1 的时候调用 onInactive 方法会在活动的观察者从 1 变成 0 的时候调用 添加观察者:observeForever 另外,除了...转换 LiveData Transformations.map() 在数据分发给观察者之前对其中存储的值进行更改,返回一个新的 LiveData,可以使用此方法 private val _state

97420

Android 数据绑定库 — 从可观察域到 LiveData 仅需两步

几年后,作为第一波架构组件的一部分,我们发布了 LiveData,这又是一个可被观察的。这是与数据绑定兼容的候选,因此我们添加了此功能。...LiveData 是可以感知生命周期的,对于可观察域而言,这并不是一个很大的优势,因为数据绑定库已经检查了视图何时处于活动状态。... = _name // Expose the immutable version of the LiveData } 复制代码 第二步:设置 LiveData 的生命周期所有者 绑定类有一个名为...binding.name = myLiveData // or myViewModel 注意:如果要设置 fragment 的内容,建议使用 fragment.viewLifecycleOwner(不是...fragment 的生命周期)来处理潜在的分离的 fragments。

1.1K30

谁能取代Android的LiveData- StateFlow or SharedFlow?

这类似于LiveData给我们提供的自动处理Lifecycle的方式。 注意:你可能会选择在你的表现层(活动)中继续使用LiveData。...这种方法的第一个问题是对生命周期的处理LiveData会自动为我们处理。我们在上面的例子中通过使用 launchWhenStarted {}实现了类似的行为。...然而,为了使这种架构顺利运行,你需要保证你的每个其他组件都从ViewModel访问你的LiveData不是直接从Repository访问Flow。...我们可以应用stateIn(),不是应用shareIn()操作符来具体化流。...它还支持将这些数据作为一个类的实例不是DataSnapshot来获取。这是通过Flow转换完成的。该库的源代码完成了本文中给出的例子。

1.4K20

Android-ViewModel和LiveData使用详解

LiveData一个可观察的数据持有者类。与常见的观察者不同,LiveData是有生命周期感知的。这意味着它尊重其他应用程序组件的生命周期,比如Activity、Fragment或Service。...这种感知确保LiveData只更新处于生命周期状态内的应用程序组件。 LiveData是由observer类表示的观察者视为处于活动状态,如果其生命周期处于STARTED或RESUMED状态。...LiveData会将观察者视为活动状态,并通知其数据的变化。LiveData未注册的观察对象以及非活动观察者是不会收到有关更新的通知。...观察者可以在每次应用程序数据更改时更新UI,不是每次发生更改时更新UI。 没有内存泄漏 当观察者被绑定他们对应的LifeCycle以后,当页面销毁时他们会自动被移除,不会导致内存溢出。...不用再人为的处理生命周期 Activity或者Fragment只要在需要观察数据的时候观察数据即可,不需要理会生命周期变化了。这一切都交给LiveData来自动管理。

3.4K30

【译】LiveData with Coroutines and Flow

但有了ViewModel+LiveData,我们就不必再处理这个问题了。这就是为什么我们在《应用程序架构指南》中推荐这种方法。...然而,虽然轮子让非阻塞的一次性操作变得更容易,但这对Flow来说并不是同样的情况。Flow仍然是难以掌握的。不过,如果你想创建快速可靠的反应式UI,我认为值得花时间来学习。...因此,我们可以从数据源和存储库中暴露Flow,不是LiveData,但ViewModel仍然暴露LiveData,因为它是生命周期感知的。...One-shot operations in the data source 如果你正在使用一个支持suspend函数的库,如Room或Retrofit,你可以简单地从你的suspend函数中使用它们。...值得注意的是,如果这个coroutine被取消,resume将被忽略,所以如果你的请求需要很长的时间,这个coroutine将处于活动状态,直到其中一个回调被执行。

1.4K10
领券