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

LiveData beyond the ViewModel

它是一个简单观察者,能够意识到观察者生命周期。从你数据源或存储库暴露LiveData是使你架构更具反应性一个简单方法,但也有一些潜在陷阱。...请注意,数据不是自动为你组合,MediatorLiveData只是负责通知工作。 为了在我们示例应用程序实现转换,我们需要将两个不同LiveDatas合并成一个。...请记住,LiveData会将最新值分派给新观察者。另外,Lollipop引入了Activity转换,它们带来了一个有趣边缘情况:两个Activity处于活动状态。...这意味着LiveData唯一消费者可能有两个实例,其中一个可能会显示错误数据。 解决这个问题方法是为每个消费者返回一个LiveData。...然而,我们正在泄露所有以前LiveDatas,这些LiveDatas不会再发送更新,所以这是一种浪费。 你可以存储一个对源引用,然后在添加新源之前将其删除。

1.5K30

LiveData Coroutine Builder5个诡计

它就像一个简化反应式组件(例如RxJava或KotlinFlow),也知道视图生命周期。...这将有助于克服以下问题: 如果主线程很忙,LiveDatapostValue就会丢弃。 LiveData转换功能都是在主线程完成。...Connecting Multiple LiveData Source Emission 在这种情况下,我们有多个LiveDatas源数据,我们想控制数据输出逻辑,我们也可以使用Coroutine Builder...Delay and Keep Coroutine Alive Temporarily 我们在liveData coroutine builder一个特殊功能是,它可以被配置为在LiveData不活动特定时间内保持...如果它在之前运行成功完成,它不会重新启动。注意,只有在自动取消情况下才会重新启动。如果该块因任何其他原因被取消(例如抛出一个CancellationException),它不会被重新启动。

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

一篇掌握LiveData transformations

下面的所有例子都将使用下面的数据类,它代表了我们从数据库或后台API接收一个Player数据。这个Player模型只有一个名字和分数字段,以方便举例,但在现实,它将有更多字段。...为了解决这个问题,我应该使用MediatorLiveData来合并Player和Game,如果他们任何一个被更新。这将看起来像这样。...我正在观察两个LiveData源(a和b)。...我在调解器创建时调用了更新函数,只有在两个源都是非空情况下才会发出一个值。这种模式非常通用,但让我们一个一个地走完每一步。 方案1 在从这个LiveData发出任何东西之前,你想监控哪些源变化。...(即让你对单个LiveData进行条件映射或合并多个LiveDatas) 方案2 如果你想在创建MediatorLiveData时设置一个初始值,在这里调用内部更新函数。

1.3K20

Android 架构组件最新进展 (上篇)

其中 androidx.* 库与 Framework API 解耦,这能够提供向后兼容同时,也能更频繁地更新。 Android Jetpack 架构组件帮助您设计稳健、测试且易维护应用。...根据 2019 年最新开发者调查,70% 以上专业开发者用过这五个库当中至少一个库进行应用开发,接下来我们将用上、下两篇文章为大家介绍 Android 架构组件最新更新: ?...ID, 它就会在绑定成为一个可用字段。...或者直接在 XML 设置一个变量,并在视图中访问,代码也能马上给出对应提示。这些都即时可用,无需编译! ? ?...ViewModel 来管理 使用 URI 直接导航 对话框可以做为导航目标 更好地对动态功能做出支持 请大家保持对本次连载关注,我们会在下篇为大家介绍分页库、Room 持久性库和 WorkManager

88940

【译】LiveData with Coroutines and Flow

一个视图(一个Activity、Fragment或任何生命周期所有者)被创建时,ViewModel被获得,它开始通过一个或多个LiveDatas暴露数据,而视图订阅了这些数据。...操作是你在应用需要做任何事情,比如从网络上获取数据、过滤结果或计算一些文本排列。 对于你创建任何操作,你需要考虑其范围:从启动到取消时间范围。让我们看两个例子。...你在一个ActivityonStart启动一个操作,你在onStop停止它。 你在ViewModelinitblock启动一个操作,然后在onCleared()停止它。...LiveData: Suspend transformation 比方说,你想对来自数据源东西进行转换,但它可能是CPU密集型,所以它是在一个suspend函数。...在这个例子,我们使用API让我们设置了一个完成监听器和一个失败监听器,所以在它们回调,当我们收到数据或错误时,我们会调用continuation.resume或continuation.resumeWithException

1.3K10

改造 Android 官方架构组件 ViewModel

, 在 Activity 执行 onDestroy 时需要释放一些对象资源, 也可以使用到生命周期组件 LiveData LiveData 具有两个功能, 第一个功能是观察者模式, 在 Value 发生变化时通知之前注册所有观察者...UI, 但这个页面已经不可见, 这时就会停止同步 UI 操作 ViewModel ViewModel 有两个功能, 第一个功能可以使 ViewModel 以及 ViewModel 数据在屏幕旋转或配置更改引起...于是我认真的研究了其源码, LiveData 具有两个功能, 通知观察者更新数据和根据生命周期停止和恢复之前事件, 而 Rxjava 加上 RxLifecycle, RxJava 加上 AutoDispose..., 或 Rxjava 加上生命周期组件, 也可以轻易做到根据生命周期停止和恢复之前事件, 在配上 Rxjava 强大操作符, LiveData 能做事 RxJava 都能做, LiveData能做事...数据在屏幕旋转或配置更改引起 Activity 重建时存活下来, 重建后数据继续使用, 这个功能十分实用且十分重要, 因为之前也没有一个官方解决方案, 所以我觉得很有必要将这个功能引入 MVPArms

73310

python带*号参数,一个星号,两个星号

1.带一个星号(*)参数函数传入参数存储为一个元组(tuple)2.带两个星号(*)参数函数传入参数则存储为一个字典(dict),并且再调用是采取a=1,b=2,c=3形式3.传入参数个数不定...,所以当与普通参数一同使用时,必须把带星号参数放在最后。...4.函数定义时候,再函数参数前面加星号,将传递进来多个参数转化为一个对象,一个星号转换成元组,两个星号转换成字典,相当于把这些参数收集起来5.参数前加一个星号,将传递进来参数放在同一个元组,该参数返回值是一个元组...6.参数前两个星号,将传递进来参数放到同一个字典,该参数返回值为一个字典function_with_one_star(*d): print(d, type(d))def function_with_two_stars...(**d): print(d, type(d))# 上面定义了两个函数,分别用了带一个星号和两个星号参数,它们是什么意思,运行下面的代码:function_with_one_star(1, 2,

3.1K20

两个目录,删除其中一个目录同名文件做法

假设现在有一个目录/mnt/data,还有另外一个目录/opt/data,需要删除/opt/data目录中和/mnt/data目录同名文件。...-. 1 root root 0 Jan 10 23:25 huihui -rw-r--r--. 1 root root 0 Jan 10 23:25 shanghai 正确做法: 注意,下面命令.../ grep -v 参数指定反选择, /$指定以/结尾搜索模式,因此该命令将输出不带/结尾项,也就是只输出/opt/test_a目录文件名,不包含子目录。...xargs命令-I{} 指定用管道传递过来输入替换后面命令{}字符串,重复多次,直至管道没有输入 注:xargs加上 -t 参数,可以看到替换效果 检查一下,发现上面命令执行后,/opt/data...目录下同名文件已经删除了 [root@centos6-vm01 data]# ll /mnt/data/ total 0 -rw-r--r--. 1 root root 0 Jan 10 23:24

1.5K100

经典算法题 -- 寻找一个数组不重复两个

引言 地铁上闲来无事,刷到一道算法题: 一个整型数组里除了两个数字之外,其他数字都出现了两次。 请写程序找出这两个只出现一次数字。 看题目描述很简单,那么,如何解决呢? 2....但题目中出现一次数字是两个不相同数,所以如果我们仍然将所有数字异或,最终将会得到这两个不相同数字异或结果,我们是否有办法在异或结果中将两个数字还原为原来数字或转化为寻找数组只出现一次一个数字呢...办法是有的,既然两个数字是不同,那么最终异或结果一定不为 0,而这个结果数字,为 1 位表示两个出现一次,这两位不同。...假设异或结果数字,第 n 位为 1,则说明两个只出现一次数字一个第 n 位为 1,一个第 n 位为 0,我们可以将原数组划分为两个数组,分别是所有第 n 位为 0 数组成数组和所有第 n...位为 1 数组成数组,这样既可以保证所有相同数都被放入同一个数组,也可以保证两个只出现了一次数分别被放入两个不同数组,于是,最终我们将问题转化为找到分别在两个数组找到每个数组只出现一次一个数字

93830

关于一个数组两个和等于给定数问题

今天我遇到这样一个问题,问题描述如下:         给出一个数组,再给定一个数target,如果数组中有两个和等于target,那么返回这两个索引,如果说有多对数都符合条件则返回第一对,返回结果用一个长度为...=0,那么返回[1,4],另外一个特例就是两个数可能在同一个位置上这样不能返回同一个索引,如[0,1,4]  target=0,并不是返回[1,1],而是不存在这样两个数,讲清楚题之后那么我们再看具体解题思路...,就证明这对数是存在,但是我们仅仅是set是找不到,target-n索引,并且如果有两个索引在一个位置,那么这时set是无法区分,有人数当遍历某个数时候把它从集合删除不就行了吗,就会解决现在这个问题...n时判断,target-n是否在map,如果在则返回索引,这是还是会出现上述两个问题,首先如果有多个数重复时候,那么map一个数它value值存放是,这些相同数最后一个索引,所以我们在判断是否存在这样一对数时候再加上条件...3个数一个数n,然后从剩余找出两个和等于-n两个数,那么这样的话,时间复杂度会减少到o(n*n),并且如果再仔细斟酌,那么第一个遍历过数都不会被算在内,那么程序将会更加快,这里只提供思路

72320

Android lifecycle 使用详解

,在 BaseActivity 时候调用 IBasePresenter onDestroy 方法,这样也确实能做到。...那有没有更好方法呢?当然是有的,lifecycle 就可以解决这个问题。接下来,我们先来看一下 Lifycycle 基本使用。...---- Lifycycle 基本使用 引入相关依赖包 Lifecycle 已经是稳定版,它包含在 support library 26.1.0 及之后依赖包,如果我们项目基于这些依赖包,那么不需要额外引用...这样会存在一个问题,调用者必须知道比较清楚得知道 MediaCompoment 设计,否则可能会忘记调用 onDestroy 方法。...那有没有一种方法, 当 Activity 生命周期变化时候,MediaCompoment 自身能够检测到 Activity 生命周期变化,从而做相应处理。

1.4K50

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

理想情况下,数据在流转过程,每个环节都不会存储数据,也不会修改数据源数据,而是生成一个数据传递给下一个环节。 ---- 3....3.1 常规,但是不优雅例子 在JAVA我们想要订阅一个数据源,构建一个最简单关系:“输出 = 输入”,在最基本情况下,可以这么做: ?...3.3 最简单方案 有没有更好方法呢?...对比 好解决方案大概率别人也会想到。对比我们设计LiveData Extensions和github上两个同类型库(这两个库排名最靠前,star都在500左右)。 ?...如果确有耗时操作需求,LiveData Extensions里还提供了switchMap操作符,这是一个异步操作符,它会生成一个LiveData,合并到当前数据流

1.6K10

让人耳目一新 Jetpack MVVM 精讲!

LiveData 有个坑需要注意 Jetpack ViewModel ViewModel 存在前混沌世界 ViewModel 为什么能做到这几点?...如果这么说还不理解的话,具体参考我在 《为你还原一个真实 Jetpack Lifecycle》 中提供 GpsManager 案例,本文不再累述。...对上述状况不理解具体参考我在 《LiveData 鲜为人知 身世背景 和 独特使命》 中提供 播放器状态全局通知 案例 LiveData 为什么能解决上述这些问题?...到了 Jetpack 这一版,ViewModel 以精妙设计,达成了状态管理,以及共享作用域。 ViewModel 为什么能做到这几点?...(也即它是一个不可再分原子操作,本来就不需要调试),原本在视图控制器 UI 逻辑怎么写,现在还是怎么写,只不过不再需要 textView.setText(xxx),而是直接 xxx.set()。

93920

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

一个复杂问题分成两个或更多相同或相似的子问题,直到最后子问题可以简单直接求解,原问题解即子问题合并。 根据这种思想,再划分支付类目下各边界,一直到base cases。...2.1.2 划分 在划分时主要依据SOLID单一功能原则作为划分,将支付页面一个视图作为一个base case。...在实现时首先考虑使用JetpackLiveData组件来作为数据存储器类,配合JetpackViewModel使用,使得在系统配置发生改变时也可以对数据做保存。...这种感知能力确保 LiveData 仅更新处于活跃生命周期状态应用组件观察者。...这些LiveData最终加入到支付业务ViewModel内,同时在base case暴露统一方法向外传递自身数据。

65420

LiveData:还没普及就让我去世?我去你 Kotlin 协程

LiveData 是 Android 官方在 2017 年推出一系列架构组件一个,跟它一起还有 ViewModel 和 Lifecycle 等等,以及这几年陆续出现一个个新成员。...跟一般订阅比起来,LiveData两个特点:一是它目标非常直接,直指界面刷新,所以它数据更新只发生在主线程;二是它借助了另一个架构组件——Lifecycle——功能,让它可以只在界面到了前台时候才通知更新...但是这里就会有一个问题:变量订阅,用 RxJava 不能做吗?为什么要搞一个新库出来呢?RxJava 就是专门做事件订阅呀? 是因为…… LiveData 数据更新发生在主线程?...所以 RxJava 太大了,并且是第三方,这两个原因结合起来,就让 Android LiveData 没有使用 RxJava。这并不是一个竞争或胸怀问题,而是一个「不要把事情变复杂」问题。...视频(文章)开头那个问题,Yigit 回答是:LiveData 不会被废弃,因为两个原因: 用 Java 写 Android 的人还需要它——Flow 是协程东西,所以如果你是用 Java ,那其实没办法用

88050

由浅入深,详解 LiveData 那些事

LiveData简要快析 在官方描述LiveData 如下所示: LiveData 是一种可观察数据存储器类。...这种感知能力确保 LiveData 仅更新处于活跃生命周期状态应用组件观察者。...为了解决上述问题,我们增加了 [版本号] 概念,我们 ObserveData 持有一个最新版本号,每一个观察者包装类 ObserverLifecycleWrapper 也维护着这个版本号。...而在 LiveData 设计,observe() 和 postValue() 两个方法是离我们开发者最接近,而了解完这两个方法,也就不难理解LiveData底层实现,以及为其他问题解析做出铺垫。...具体参见 Android-architecture-simple-SingleLiveEvent 手动维护version 这个方式可以说是对 SingleLiveEvent 一个完善与补充

1.2K20

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

随着业务场景复杂度提升,LiveData作为数据唯一载体似乎渐渐无法担此重任,其中一个痛点就是由于模糊了“状态”和“事件”界限。...痛点一:蹩脚地处理ViewModel和View层通信 发现问题 当屏幕旋转后,LiveData不好用了?...项目由MVP过渡到MVVM时,其中一个典型重构手段就是将Presenter回调写法改写成在ViewModel持有LiveData由View层订阅,比如以下场景: 在大力自习室,当老师切换至互动模式时...先不谈它有没有其他问题,但就其对LiveData魔改包装给我第一感受是强扭的瓜不甜,违背了LiveData设计思想,其次它就没有别的问题了吗?...总的来说,上述两个问题根本都在于没有更好手段去处理ViewModel和View层通信,具体表现为对LiveData泛滥地使用以及没有对 “状态” 和 “事件” 进行区分 分析问题 根据上述总结,LiveData

3.1K20
领券