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

【译】LiveData三连

因为它们生命周期不在我们控制之下,它们可以任何时候根据用户互动或其他因素(如低内存)被销毁。如果我们一个UI组件中创建和处理我们数据,一旦该组件被销毁,我们所有的数据都会被销毁。...我希望你能从这篇文章中获得一些关于LiveData知识,了解它在哪些情况下可以提供帮助,如何使用它,以及为什么它可能是一个比其他现有方法更好解决方案。有其他想法?有更好解决方案?...因此,肯定会有一种试图最大限度地利用它们诱惑:) 在这篇文章中,我将谈谈什么情况下推荐使用LiveData,以及你可以使用替代方案。...你可以使用RX Flowable或KotlinFlow来正确处理这个问题。下面的图片展示了背压正确处理。在你使用LiveData情况下,9,10,11将被丢弃,以提供最新。...这也可以说是一种优势,如果你不需要完全控制,而只是知道变化会命中UI线程,而不需要任何额外切换线程步骤,这听起来像是某些情况下一种优势。 5.

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

ViewModel:持久化、onSaveInstanceState()、UI 状态恢复和 Loader

进程终止时候你没有机会持久化数据。因此如果你想最大可能保持数据丢失,你应该在用户一进入(activity)时候就进行持久化。...如果你允许类似设备突然关机情况下丢失数据,你可以 'onStop()'回调时候将其保存,这个方法 activity 一进入后台时候就会被调用。...ViewModel 与其他架构组件 LiveData 和 Room 一起使用可以替代 Loader。ViewModel 保证配置更改后数据丢失LiveData 保证 UI 与数据同步更新。...结合 ViewModel 和 LiveData 一起使用可以代替 Loader。你可以使用 Room 来代替 CursorLoader 功能。...如果你有关于 ViewModel 或者任何架构组件问题,请查看我们反馈页面。关于本系列任何问题,敬请留言。

3.7K30

ViewModel:持久化、onSaveInstanceState()、UI 状态恢复和 Loader

进程终止时候你没有机会持久化数据。因此如果你想最大可能保持数据丢失,你应该在用户一进入(activity)时候就进行持久化。...如果你允许类似设备突然关机情况下丢失数据,你可以 'onStop()'回调时候将其保存,这个方法 activity 一进入后台时候就会被调用。...ViewModel 与其他架构组件 LiveData 和 Room 一起使用可以替代 Loader。ViewModel 保证配置更改后数据丢失LiveData 保证 UI 与数据同步更新。...结合 ViewModel 和 LiveData 一起使用可以代替 Loader。你可以使用 Room 来代替 CursorLoader 功能。...如果你有关于 ViewModel 或者任何架构组件问题,请查看我们反馈页面。关于本系列任何问题,敬请留言。 掘金翻译计划 是一个翻译优质互联网技术文章社区,文章来源为 掘金 上英文分享文章。

92720

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

LiveData对象一旦连接到系统服务,任何需要该资源Observer都只需观察这个LiveData对象。 如何使用LiveData? 1.创建一个LiveData实例来保存特定类型数据。...所以我们需要在一开始就设置好观察。 通常情况下LiveData只在数据有变化时,给活跃Observer进行通知。 此行为一个例外是,Observer在从非活跃状态变为活跃状态时也会收到通知。...MutableLiveData类暴露公用setValue(T)和postValue(T)方法,如果需要编辑存储LiveData对象中,必须使用这两个方法。...转换LiveData 您可能希望先转换存储LiveData对象中,然后再将其分派给Observer,或者您可能需要根据一个LiveData实例返回不同LiveData实例。...Transformations.map() 使用一个函数来转换存储LiveData对象中,并向下传递转换后

2.2K30

再谈协程之viewmodel-livedata难兄难弟

LiveData主要问题: postValue异步线程可能丢失数据:源码中新建Runnable时候,只对mPendingData进行了修改,并不是加入线程池,导致数据丢失 对数据流处理能力偏弱:...由此可见,LiveData作为一个数据观察者实现,完全是可以脱离ViewModel单独Activity中使用,但是,这样做与直接使用RxJava之类异步框架并没有太大区别,Google这套AAC...借助委托,我们可以很方便去除这类getXXX代码,Ktx中,提供了下面的委托来获取ViewModel,代码如下所示。...但这样创建ViewModel有个小问题,我们可以看下它源码,ViewModelProvider中,它默认NewInstanceFactory是使用反射来创建VIewModel无参构造函数,如下所示...而且该协程构造器返回是一个不可变LiveData可以直接暴露给对应UI层使用作用域中,可以通过emit()函数来更新LiveData数据。 这样整体流程就通了,而且,非常简单不是

1.1K40

使用 Architecture Component 实现 MVVM 正确姿势

可以实现当 Activity 状态发生变化诸如屏幕旋转时候,数据能保存下来而不会丢失。...粘性消息特性以及适用场景 LiveData 默认是支持粘性消息,也就是 observe() 时候可以拿到 observe() 之前赋给 LiveData 。...,如果要使用 LiveData 来实现非粘性消息(observe() 时候接收之前赋给 LiveData ),有各种 workaround 方式,具体可以移步至我另一篇文章:LiveData...非粘性消息探索和尝试 LiveData 变换和组合 有时候我们希望对 LiveData 做一些变换或者其他处理再提供给 View 层使用可以使用 Transforms 一对一静态转换 —— map...如果使用 LiveData,因为 ViewModel 本身是不具备生命周期可以考虑使用 Transforms + LiveData;如果使用其他注册监听器方式,可以 ViewModel onCleared

75820

谁能取代AndroidLiveData- StateFlow or SharedFlow?

❝这些都不能被看作是纯粹Flow内在缺陷:这些只是使它不能很好地替代LiveData特点,但在其他情况下可以很强大。...在这种情况下,你可以通过使用Flow.asLiveData()扩展函数ViewModel中轻松地从Flow转换为LiveData。...对于重放参数,我们可以使用1:新订阅者将在订阅后立即获得最后一个发出。...状态流总是有一个初始,向新订阅者复制一个最新缓冲任何更多,但保留最后发出一个,并且不支持 resetReplayCache。...回答这个问题简单方法是试图回答其他几个问题。 "我真的需要在任何时候用myFlow.value访问流的当前状态?" ❝如果这个问题答案是否定,你可以考虑SharedFlow。

1.4K20

一篇掌握LiveData transformations

很多时候,我们可能会收到一个包含任何相关变化通知。如果我们监听是所有球员名字,我们不想在分数发生变化时更新用户界面。这就是distinctUntilChanged方法用处。...我调解器创建时调用了更新函数,只有两个源都是非空情况下才会发出一个。这种模式非常通用,但让我们一个一个地走完每一步。 方案1 在从这个LiveData发出任何东西之前,你想监控哪些源变化。...为了简单起见,我通常调用我更新函数,但只是设置MediatorLiveData/postValue也可以某些情况下,我不想发出一个初始,因为我希望a或b还没有设置情况下发出空。...方案4 由于MediatorLiveData是一个LiveData实例,我们可以设置(像上面的例子)或调用postValue(如果由于某种原因,你发射时不在主线程上)。...这也是你决定如何转换源数据地方。上面的例子只是将aVal和bVal相加,但你当然可以在这里应用你想要任何转换。

1.3K20

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

参考简答: ViewModel作用在于解决Android应用中活动和碎片(Fragment)生命周期问题。它允许数据屏幕旋转等配置更改时存活,并确保数据不同组件之间共享而丢失。...ViewModel存活周期: 使用ViewModel正确处理配置变化,保证数据屏幕旋转等情况下丢失。...问题: 请对比LiveData和Observable,分析它们Android应用中应用场景,以及何种情况下选择使用哪种。...高级任务调度中,我们可以: 自定义Worker: 实现Worker类以执行具体任务,并通过Constraints来定义任务触发条件,如网络状态、电量等。...适度使用Room内存缓存: 使用@Query注解LiveData返回时,Room会自动在内存中维护缓存,但要注意不要过度依赖,以免造成内存浪费。

15810

LiveData Coroutine Builder5个诡计

但如果我们有一个流程,其中数据是连续排放我们可以使用: val someTypeLiveData: LiveData = stateFlow.asLiveData(...Connecting Multiple LiveData Source Emission 在这种情况下我们有多个LiveDatas源数据,我们想控制数据输出逻辑,我们可以使用Coroutine Builder...Delay and Keep Coroutine Alive Temporarily 我们liveData coroutine builder中一个特殊功能是,它可以被配置为LiveData活动特定时间内保持...如果它在之前运行中成功完成,它不会重新启动。注意,只有自动取消情况下才会重新启动。如果该块因任何其他原因被取消(例如抛出一个CancellationException),它不会被重新启动。...如果coroutine超时前完成,即使Activity还没有恢复,coroutine也不会被重新启动,而只是发出它最后一个

1.5K60

Jetpack-Compose 学习笔记(五)—— State 状态是个啥?又是新概念?

State 状态:官方文档上说 State 状态是指可以随时间变化任何。例如,它可能是存储 Room 数据库中、类变量,加速度计的当前读数等。怎么理解这个概念呢?...可以看出,这些都是一种可观察数据变化容器,被它们修饰对象,我们可以观察到该对象变化,从而更新界面。没错,都是使用观察者模式。...ViewModel 经常与 LiveData 一起使用,但在 Compose 中,推荐使用 MutableState 来具体存储数据。...所以,不要在有添加或移除 Composable 组件情况下使用 remember 将重要内容存储 Composable 组件中,因为添加和移除都会使得数据丢失。 5....6.3 MapSaver Compose 还考虑到有些情况下 Parcelize 不适用场景,那么还可以使用 MapSaver 来定义自己存储和恢复规则,规定如何把对象转为可保存到 Bundle 中

2K30

掌握 Jetpack Compose 中 State,看这篇就够了

State可以是任意类型:如像Boolean或者String一样简单基础类型,也可以是一个包含整个渲染到屏幕上 UI 状态复杂数据类型。...如果少写了代码行中几个神秘关键字,会有什么问题?如果不使用mutableStateOf()?...无状态可组合项是持有自身状态可组合项。它们 Jetpack Compose 里有各自适用场景。什么时候应该把可组合项设计成无状态可组合项?大多数情况下我们需要尽可能让可组合项保持无状态。...它本身持有任何状态相关实例——所以它自然就是一个无状态可组合项。什么时候应该把组合项设计成有状态组合项?...() } val state by homeViewModel.inputText // TODO use state}例外情况:把 TextInput 设计成有状态可组合项一些特殊情况下我们可能需要考虑使用一个有状态可组合项

7.2K111

由浅入深,详解 LiveData 那些事

runable 中,会直接去取最新待同步,然后将其置为默认,最后执行真正数据更新,即 setValue(); 不过需要注意,多线程下调用,可能会丢失某次通知。...具体我们看一眼官方对其描述: ---- 但既然 LiveData 这么安全好用,所以就会有开发者想着使用 LiveData 用于事件通知,此时它设计某种程度上就成了问题,虽然官方建议里,非常建议直接这么用...SingleLiveEvent 计算机科学领域一直流传着一句格言:任何问题都可以通过增加一个间接中间层来解决。...相应 Android上 面,Flow 也可以通过 asLiveData() 从而转为LiveData,由此兼容使用。...因为不谈背景情况下,没有绝对标准与统一准则,那就更别提对与错。但至少对于 LiveData 而言,了解完本篇你,我相信再也不会再有相关疑问。

1.3K20

写给初学者Jetpack Compose教程,使用State让界面动起来

上述代码采用做法是,定义一个count变量,Text控件中显示这个count变量,并且每次点击Button时让count变量加1。 思路非常简单,那么这段代码能正常工作?...: 0).plus(2) } } 这段代码和Compose没有任何关系,完全是纯粹ViewModel和LiveData用法。...但是传统LiveData用法Compose中并不好使,因为传统LiveData依赖于监听某个变化,并对相应界面进行更新,而Compose界面更新则依赖于重组。...说到StateFlow,它本来和LiveData用法就极其相似,最大不同点可能就在于StateFlow是用Kotlin编写,它可以初始化时候就传入一个初始,从而确保它永远不会为空。...因此我们incrementCount()和incrementDoubleCount()函数里可以直接对其加1加2,而不用像之前LiveData那样写一段很奇怪空指针保护代码了。

68620

Android | LiveData 源码分析

前言 LiveData 是一种持有可被观察数据存储类,和其他可被观察类不同是,LiveData 是就要生命周期感知能力,这意味着他可以 Activity ,fragment 或者 service...LiveData 只会将数据更新给活跃观察者。 添加观察者时候,可以传入 LifecycleOwner 。...,它会在变为活跃状态时接收最新数据 配置更改后也会接收到最新可用数据 共享资源,可以使用单例模式扩展 LiveData 对象,以便在应用中共享他们 LiveData 使用 LiveData 是一种可用于任何数据封装容器...转换 LiveData Transformations.map() 在数据分发给观察者之前对其中存储进行更改,返回一个新 LiveData可以使用此方法 private val _state...一般情况下我们都需要是最新数据,如果非要所有数据,只能重写 LiveData 了。 参考 Android Developers

97120
领券