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

Android Jetpack - LiveData

等),此感知能力确保了 LiveData 只更新处于生命周期活跃状态组件观察者 生命周期活跃状态定义是这些组件正处于 STARTED 或 RESUMED 状态,LiveData 只会更新活跃状态观察者...在生命周期销毁时会立即取消数据观察订阅 LiveData 优势 确保 UI 和数据状态同步 LiveData 遵循观察者模式。...每次应用程序数据更改时,你观察者都可以在每次更改时更新 UI,而不是更新 UI 没有内存泄露 观察者绑定到 Lifecycle 对象,并在其相关生命周期被破坏自行清理 不会因为活动停止而崩溃 如果观察者生命周期处于非活动状态...例如,后台活动在返回前台后立即接收最新数据 配置更改友好 如果由于配置更改(例如设备轮换)而重新创建活动或片段,则会立即接收最新可用数据 资源共享 你可以使用单例模式扩展 LiveData 对象以包装系统服务...LiveData 对象连接到系统服务一次,然后任何需要该资源观察者都可以只观看 LiveData 对象 使用 LiveData 使用 LiveData 常规步骤如下,我们按照下面这些步骤写一个简单例子

1.9K30

响应式编程|Kotlin与LiveData扩展函数实践技巧

那么可以想见,我们需要花额外精力去构建和维护一个b和a关系。 而响应式编程想法正是企图用某种操作符帮助你构建这种关系。 它思想完全可以用下面的代码片段来表达: ?...3.4 实现方案 遗憾是我反复翻阅LiveData源码也未找到合适观察者接口。...基于这个方法,我们可以给LiveData添加观察者,打通了最难一步。很妙观察者本身也是LiveData类型,这样我们就可以实现链式观察者程序。 例如最基础map操作符: ?...如前所述,为了应付各种各样构建关系情况,事实上我们做了非常多LiveData Extension。 例如:转换 ? 例如:合并多个LiveData ? 更多... ?...另外,我们更主张使用多个LiveData联合触发而非特别长链式表达,如果确实需要特别长链式表达,尤其是需要反复切换线程情况,我们建议使用RxJava。

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

Android程序员该如何去手写事件通信方案LiveDataBus

LiveData具有以下优点: 1.能够保证数据和UI统一 这个和LiveData采用了观察者模式有关,LiveData是被观察者,当数据有变化时会通知观察者(UI)。...二、LiveData使用 在了解LiveData定义和优点,那它到底怎么应用呢?...MediatorLiveData可以看成是多个LiveData代理,当将多个LiveData添加到MediatorLiveData,任何一个LiveData数据发生变化时,MediatorLiveData...根据Fragment/Activity生命周期发生变化时,移除观察者或者通知观察者更新数据。 当调用LiveDatasetValue()、postValue()方法,通知观察者更新数据。...在LiveData数据变化,通过postValue(可后台线程)或者setValue(主线程)设置,将触发ObserveronChanged,开发者只需onChanged等待最新数据回调即可。

1.3K10

Jetpack源码解析—LiveData使用及工作原理

此感知确保LiveData仅更新处于活动生命周期状态应用程序组件观察者。 2.2 优点 1. 确保UI符合数据状态 LiveData遵循观察者模式。...首先声明一个LiveData对象: private lateinit var liveData: MutableLiveData 点击开始观察数据按钮,弹出控制台,我们可以看到控制台输出了...//遍历LiveData所有观察者执行下面代码 for (Iterator<Map.Entry<Observer<?...LiveData代码很简洁,400多行代码,看起来也并不费劲,下面我们来分析下整个流程: 通过使用LiveData对象,为它创建观察者Observer 创建Observer时绑定Fragment生命周期...类,可以帮助我们实现这样场景: 通过**Transformations.map()**使用一个函数来转换存储在 LiveData对象中值,并向下传递转换值: LiveDataViewModel

98220

Jetpack之LiveData详解

主要有如下两个作用: 实时刷新数据 防止内存泄漏 LiveData 采用观察者模式,当 LiveData 保存数据发生变化时就会通知观察者观察者接收到通知可以进行 UI 数据刷新或者其他操作。...它实现很简单,就是继承了 LiveData 然后向外暴露了 setValue、postValue 方法 MediatorLiveData:它继承自 MutableLiveData 可以监听多个 LiveData...数据源,或者调度多个 LiveData 数据源决定向观察者发送那个 LiveData 数据更新。...使用 前面 Hello LiveData 简单展示了 LiveData 使用 LiveData 除了依赖生命周期对象实现观察者自动管理外,还可以添加忽略生命周期观察者, 使用 observeForever...LiveData 数据源,可以观察或调度多个 LiveData 数据源。

1.6K20

解决Android开发中痛点问题用Kotlin Flow

LiveData粘性机制会带来副作用,但这本身并不是LiveData设计缺陷,而是对它过度使用。 Kotlin Flow是基于kotlin协程一套异步数据流框架,可以用于异步返回多个值。...痛点一:蹩脚地处理ViewModel和View层通信 发现问题 当屏幕可旋转LiveData不好用了?...,页面需要更改同时还会弹出Toast提示模式已切换。...LiveData会保证订阅者总能在值变化时候观察到最新值,并且每个初次订阅观察者都会执行一次回调方法。...但选型时我们要考虑以下问题,也是LiveData被推荐使用优势 : 是否会发生内存泄漏,观察者生命周期遭到销毁能否自我清理 是否支持线程切换,比如LiveData保证在主线程感知变化并更新UI 不会在观察者非活跃状态下消费事件

3.1K20

Android | LiveData 源码分析

,它会在变为活跃状态时接收最新数据 配置更改也会接收到最新可用数据 共享资源,可以使用单例模式扩展 LiveData 对象,以便在应用中共享他们 LiveData 使用 LiveData 是一种可用于任何数据封装容器...= null) //根据条件返回对应 livedata else //根据条件返回对应 livedata } 合并多个 LiveData var live1 =...发送数据是粘性 例如再没有观察者时候发送数据,此时 mVersion +1,等到真正添加了观察者,生命周期也是活跃,那么就会将这个数据重新分发到观察者。...代码可以参考这里 数据倒灌现象 一般情况下,LiveData 都是存放在 ViewModel 中,当Activity重建时候,观察者会被 remove 掉,重建后会添加一个新观察者,添加观察者版本号就是...这种解决方式和上面一样,反射修改版本号就可以解决 非活跃状态观察者转为活跃状态,只能接收到最后一次发送数据。

93720

LiveData前世今生

,代码中有一些模板代码(每个事件在ViewModel中都有一个或者多个新方法),而且容易出错;很容易忘记从观察者那里调用ViewModel。...确保你用户界面与你数据状态相匹配:LiveData遵循观察者模式,当生命周期状态改变时,LiveData会通知观察者对象。你可以整合你代码来更新这些观察者对象中UI。...Jose解决方案缺乏对多个观察者支持,而这正是LiveData以 "共享资源 "为名承诺之一。 它不是线程安全。 我还可以补充一个问题。...The recommended solution 你可以在LiveData类本身中找到处理多个观察者标准方法,那就是将原始观察者包裹起来。...其次,每个观察者都会以自己所有者身份注册到父级LiveData

1.1K10

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

,代码中有一些模板代码(每个事件在ViewModel中都有一个或者多个新方法),而且容易出错;很容易忘记从观察者那里调用ViewModel。...确保你用户界面与你数据状态相匹配:LiveData遵循观察者模式,当生命周期状态改变时,LiveData会通知观察者对象。你可以整合你代码来更新这些观察者对象中UI。...Jose解决方案缺乏对多个观察者支持,而这正是LiveData以 "共享资源 "为名承诺之一。 它不是线程安全。 我还可以补充一个问题。...The recommended solution 你可以在LiveData类本身中找到处理多个观察者标准方法,那就是将原始观察者包裹起来。...其次,每个观察者都会以自己所有者身份注册到父级LiveData

1.2K10

LiveData详细分析

LiveData需要一个观察者对象,一般是Observer类具体实现。当观察者生命周期处于STARTED或RESUMED状态时,LiveData会通知观察者数据变化。... observe(),当数据更新LiveData 会通知它所有活跃观察者。...e.生命周期变化数据处理流程是怎么样? f.为什么观察者只能与一个LifecycleOwner绑定,而不是多个?...wrapper对象过程; 需要注意问题是,不能添加具有不同生命周期相同观察者,否则就会抛出IllegalArgumentException异常,但是owner可以add多个Observer; 最后添加一个...调用 observe() 注册,由于绑定了 owner,所以在 active 情况下,使用LiveData中setValue发送数据,则 Observer 会立马接受到该数据修改通知。

2.8K00

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

不同于普通观察者LiveData 遵守应用程序组件生命周期,以便 Observer 可以指定一个其应该遵守 Lifecycle。...如果 Lifecycle 被销毁,那么自动移除观察者LiveData 是生命周期感知事实给我们提供了一个新可能:可以在多个 activity,fragment 等之间共享它。...LiveData 转换 有时候可能会需要在将 LiveData 发送到观察者之前改变它值,或者需要更具另一个 LiveData 返回一个不同 LiveData 实例。...信息,以便只有在观察者观察到 LiveData 返回时才运算这些转换。...如果在调用时没有处于活动状态观察者,在添加观察者之前不会进行任何运算。 该机制允许以较少资源根据需要惰性运算来创建 LiveData

1K30

在 SnackBar,Navigation 和其他事件中使用 LiveData(SingleLiveEvent 案例)

解决方法是从 ViewModel 中将导航标志点击立刻设为 false; fun userClicksOnButton() { _navigateToDetails.value = true...例如:当没有观察者处于监听状态时,可以设置一个值,因此新值将会替换它。此外,从不同线程设置值时候可能会导致资源竞争,只会向观察者发出一次改变信号。 但是这种方法主要问题是难以理解和不简洁。...在导航事件发生,我们如何确保值被重置呢? ❌ 可能更好一些:2....使用 LiveData 进行事件处理,在观察者中重置事件初始值 通过这种方法,您可以添加一种方法来从视图中支出您已经处理了该事件,并且重置该事件。...这个方法将事件建模为状态一部分:他们现在只是一个消耗或者不消耗消息。 ? 使用事件包装器,您可以将多个观察者添加到一次性事件中。 ---- 总之:把事件设计成你状态一部分。

2.7K41

Kotlin Flow响应式编程,StateFlow和SharedFlow

可接下来,当我们按下Home键回到桌面,控制台日志依然会持续打印。好家伙,这还得了? 这说明,即使我们程序已经不在前台了,UI更新依然在持续进行当中。...但是上述例子当中,即使程序切到了后台,Flow依然没有中止,还是为它保留了过期数据,这就是一种内存上浪费。 当然,我们这个例子非常简单,在实际项目中一个Flow可能又是由多个上游Flow合并而成。...响应式编程是一种发送者和观察者配合工作编程模式,由发送者发出数据消息,观察者接收到了消息之后进行逻辑处理。 普通场景下,这种发送者和观察者工作模式还是很好理解。...但是,如果在观察者还没有开始工作情况下,发送者就已经先将消息发出来了,稍后观察者才开始工作,那么此时观察者还应该收到刚才发出那条消息吗? 不管你觉得是应该还是不应该,这都不重要。...这里我抛出这个问题是为了引出粘性定义。如果此时观察者还能收到消息,那么这种行为就叫做粘性。而如果此时观察者收不到之前消息,那么这种行为就叫做非粘性。

32310

logon dialog 弹出逻辑debug出来了,有很多有用代码片段

比较奇怪是application初始化并没有执行任何跟attachment相关代码,唯一有可能地方就是UI定义,在初始化XML View时候发出了odata请求: ?...再测试,发现application初始化时候返回空值odata call不会出现了,但是在点击attachment tab时候,发出了两次对attachment请求: ?...其中第二条odata call就是之前初始化app时候发出多余请求,说明框架内部对控件初次绑定时候是需要请求数据,于是debug了一下bindAggregation实现: 在sap-ui-core.js...总结:如果给UI5控件绑定数据时候是自己写逻辑用JSON Model,要注意一下控件初始化还没有数据时候,有没有额外odata call,造成不必要开销。...查了一下UI5API,好像没找到UI5控件支持绑定了OData 之后,数据延迟加载属性……

26020

Android Jetpack架构组件(四)之LiveData

LiveData 具有感知观察者生命周期能力,并且只有当观察者处于激活状态(STARTED、RESUMED)才会接收到数据更新通知,在未激活时会自动解除注册观察者,以降低内存泄漏风险。...观察者绑定到 Lifecycle 对象并在其相关生命周期 destroyed 自行解除绑定。 不会因为 Activity 停止而发生奔溃。...如 Activity执行finish方法,它就不会收到任何LiveData 事件。 不再需要手动处理生命周期。...由于LiveData可以在多个Activity、Fragment和Service中使用,所以可以创建单例模式。...同时,LiveData仅更新处于活跃生命周期状态应用组件观察者,也即是说LiveData并不会通知所有的观察者,它只会通知处于活跃状态观察者,那么它是如何做到这一点呢?

2.6K00

LiveData 迁移到 Kotlin 数据流

LiveData 历史要追溯到 2017 年。彼时,观察者模式有效简化了开发,但诸如 RxJava 一类库对新手而言有些太过复杂。...StateFlow 与 LiveData 是最接近,因为: 它始终是有值。 它值是唯一。 它允许被多个观察者共用 (因此是共享数据流)。...它永远只会把最新值重现给订阅者,这与活跃观察者数量是无关。 当暴露 UI 状态给视图时,应该使用 StateFlow。这是一种安全和高效观察者,专门用于容纳 UI 状态。...#2: 把一次性操作结果暴露出来 这个例子与上面代码片段效果一致,只是这里暴露协程调用结果而无需使用可变属性。...liveData 协程构建器所使用方法是 添加一个 5 秒钟延迟,即如果等待 5 秒仍然没有订阅者存在就终止协程。

1.3K20
领券