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

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

我在上篇博文中用新的 ViewModel 类开发了一个简单的用例来保存配置更改过程中的篮球分数。ViewModel 被设计用来以与生命周期相关的方式保存和管理 UI 相关的数据。...ViewModel 类开发了一个简单的用例来保存配置更改过程中的篮球分数。...ViewModel 只能在配置更改相关的销毁的情况下保留,而不能在被终止的进程中存留。...不过,在这两种场景中,你仍需要一个 ViewModel 来避免因配置更改而重新从数据库中加载数据导致的资源浪费。 ViewModel 是 Loader 的一个替代品吗?...ViewModel 不是 onSaveInstanceState() 的替代品,因为他们在与配置更改相关的销毁时保存数据,而不能在系统杀死应用进程时保存。

1K20

“终于懂了“系列:Jetpack AAC完整解析(三)ViewModel 完全掌握!

例如,界面含用户信息列表,因配置更改而重新创建 Activity 后,新 Activity 必须重新请求用户列表,这会造成资源的浪费。能否直接恢复之前的数据呢?...那么如何做到 因配置更改而新建Activity后的数据恢复呢?...到这里,我们知道了 ViewModel如何存储、实例如何获取的,但开头说的分析重点:“因配置更新而界面重建后,ViewModel实例依然存在”,这个还没分析到。...而使用ViewModel恢复数据 则 只有在 因配置更改界面销毁重建 的情况。...五、总结 本文先介绍了ViewModel的概念——为界面准备数据的模型,然后它的特点:因配置更改界面销毁重建后依然存在、不持有UI应用;接着介绍了 使用方式、Fragment数据共享。

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

    你真的了解ViewModel的设计思想吗?

    在Android中,ViewModel通常用于存储和管理与UI相关的数据,以确保这些数据在屏幕旋转或配置更改等情况下不会丢失。 原理解析 ViewModel的原理是基于ViewModelStore类。...这意味着我们无需担心内存泄漏或不必要的资源占用。 持久性存储: ViewModel可以存储大量的数据,并且在配置更改时仍然保持活动。...它的存在是为了解决以下问题: 生命周期一致性:在Android开发中,我们经常遇到配置更改(如屏幕旋转)导致Activity或Fragment被销毁并重新创建的情况。...这个ViewModel将在配置更改时保持活动,确保数据不会丢失。 高级运用 使用SavedStateHandle SavedStateHandle是一个可用于在配置更改后保持数据的工具。...这使得在ViewModel中执行耗时操作成为可能,而不会阻塞UI线程。

    32610

    由浅入深,详解ViewModel的那些事

    常见的场景有:旋转屏幕、深色模式切换、屏幕大小变化、更改了默认语言或者时区、更改字体大小或主题颜色等。 何谓异常重建? 异常重建指的是非配置变更情况下导致的 Activity 重新创建。...这也是为啥Android程序普遍不支持屏幕旋转的一部分原因,从源头扼杀因部分配置变更导致的状态丢失问题。...保命 VideModel存在之后的世界 随着 ViewModel 组件推出之后,上述因配置变更而导致的状态丢失问题就迎刃而解。 ViewModel 可以做到在配置变更后依然持有状态。...SavedStateHandle使用方式 我们知道,ViewModel 可以处理因为配置更改而导致的的状态丢失,但并不保证异常终止的情况,而官方的 SavedStateHandle 正是用于这种情况的解决方式...销毁),如果当前销毁的原因非配置更改导致,则调用 ViewModeltore.clear() ,即清空我们的ViewModel缓存列表,从而这也是为什么 ViewModel 不支持非配置更改的实例保存。

    85840

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

    而支付运营可以对不同的支付方式配置各自的优惠券以及服务费。在支付过程中,用户可能恰好遇到运营配置变动,在这种极端场景下,我们需要考虑数据更新以及视图更新。...2.1.2 划分 在划分时主要依据SOLID中的单一功能原则作为划分,将支付页面中的每一个视图作为一个base case。...在实现时首先考虑使用Jetpack中的LiveData组件来作为数据存储器类,配合Jetpack中的ViewModel使用,使得在系统配置发生改变时也可以对数据做保存。...它注重生命周期的存储和管理界面相关的数据,让数据可在发生屏幕旋转等配置更改后继续留存。...LiveData是一个粘性事件,页面由非活动状态转到活动状态,只能收到最后一次的数据,导致前序数据丢失,而某些业务场可能要求数据不丢失或非活动状态仍要接收数据,此时LiveData就不再满足需求。

    72620

    Android Jetpack - Lifecycles

    ,在 Android Jetpack - ViewModel 中,我们实现了一个简易计时器,该计时器可以在 Activity 处于配置更改或后台的情况下继续计时,我们现在利用 Lifecycle 修改它...他们不应该试图获取自己的数据;相反,使用 ViewModel 执行此操作,并观察 LiveData 对象以将更改反映回 UI 尝试编写数据驱动的 UI,其中 UI 控制器负责在数据更改时更新视图,或将用户操作通知给...ViewModel 将您的数据逻辑放在 ViewModel 类中。...这使您可以使视图更具说明性,并最大限度地减少在活动和片段中编写所需的更新代码。...一旦 ViewModel 存活时间超过活动(在配置更改的情况下 Activity 会被多次重建),Activity 会因为垃圾回收器没有妥善处理而发生内存泄露 使用 Kotlin 协程来管理长时间运行的任务以及可以异步运行的其他操作

    1.4K30

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

    不会因停止Activity而发生崩溃 如果Observer的生命周期处于非活跃状态,例如在后退堆栈中的Activity,就不会收到任何LiveData事件的通知。...正确应对配置更改 如果一个Activity或Fragment由于配置更改(如设备旋转)而重新创建,它会立即收到最新的可用数据。...{ return data.find { it.id == id } } } LiveDataFragment //改变ViewModel中idLiveData中的值...不处于活动状态(例如onPasue()、onStop())时,LiveData是不会回调observe()的,因为没有意义....(…)/value=…,是没有任何作用 当然官方推荐我们LiveData配合ViewModel一起使用,因为LiveData一般都出现在ViewModel中,所以我们下篇文章会继续分析ViewModel

    1K20

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

    ViewModel 类开发了一个简单的用例来保存配置更改过程中的篮球分数。...onSaveInstanceState(): 这个回调是为了保存两种情况下的少量 UI 相关的数据: 应用的进程在后台的时候由于内存限制而被终止。 配置更改。...ViewModel 只能在配置更改相关的销毁的情况下保留,而不能在被终止的进程中存留。...不过,在这两种场景中,你仍需要一个 ViewModel 来避免因配置更改而重新从数据库中加载数据导致的资源浪费。 ViewModel 是 Loader 的一个替代品吗?...ViewModel 不是 onSaveInstanceState() 的替代品,因为他们在与配置更改相关的销毁时保存数据,而不能在系统杀死应用进程时保存。

    3.8K30

    Andorid-JetPack-ViewModel组件

    1.什么是ViewModel 具备宿主生命周期感知能力的数据存储组件 ViewModel保存的数据,在页面因 配置变更导致页面销毁 重建之后依然是存在的 配置变更:横竖屏切换、分辨率调整、权限变更、系统字体样式变更...其实就是ViewModel实例被保存了下来,页面重建之后获取的ViewModel是同一个 2.基本用法 常规用法:存储的数据,仅仅只能当页面因为配置变更导致的销毁再重建时可复用,复用的是ViewModel...该方法中的onRetainCustomNonConfigurationInstance()这行代码, 如果我们想在activity保存一下数据,就是说因配置变更页面被销毁了,重建的时候继续复用...方法, //从而把Activity受到配置变更而不想丢失的数据给保存起来,那我们的viewModelStore对象也就被保存起来了 r.lastNonConfigurationInstances...,这个字段存储的就是因配置变更导致的被销毁的那个activity存留下来的数据 3.当handleDestroyActivity()这个方法被调用完,我们的ActivityClientRecord 这个

    1.8K30

    区域设置更改和 AndroidViewModel 反面模式

    在 ViewModel 中,如果要公开来自资源(字符串、可绘制文件、颜色……)的数据,则必须着重考虑 ViewModel 对象而忽视配置更改,例如区域设置更改。...当用户更改其区域设置时,活动将重新被创建,但不创建 ViewModel 对象。 AndroidViewModel 是已知应用程序上下文的 ViewModel 的子类。...让我们看看跟踪器中基于此问题的示例:在系统区域设置更改时更新 ViewModel 。...如果有区域设置更改,则不会重新创建视图模型。这将导致我们的应用程序显示废弃的数据,因此只能部分本地化。...由于视图(活动、片段等)具有生命周期意识,因此它将在配置更改后重新创建,以便正确地重新加载资源。

    12510

    Android Jetpack - LiveData

    生命周期状态更改时,LiveData 会通知 Observer 对象。你可以合并代码以更新这些 Observer 对象中的 UI。...每次应用程序数据更改时,你的观察者都可以在每次更改时更新 UI,而不是更新 UI 没有内存泄露 观察者绑定到 Lifecycle 对象,并在其相关生命周期被破坏后自行清理 不会因为活动停止而崩溃 如果观察者的生命周期处于非活动状态...,例如在后端堆栈中的活动的情况下,则它不会收到任何 LiveData 事件 不再需要手动处理生命周期 UI 组件只是观察相关数据,不会停止或恢复观察。...例如,后台活动在返回前台后立即接收最新数据 配置更改友好 如果由于配置更改(例如设备轮换)而重新创建活动或片段,则会立即接收最新的可用数据 资源共享 你可以使用单例模式扩展 LiveData 对象以包装系统服务...: 1、创建持有任意类型的 LiveData 实例,这一步通常在 ViewModel 中完成 2、创建一个 Observer 对象并重写其 onChanged() 方法,该方法会在 LiveData 数据更改时被回调并返回最新数据

    2K30

    C# WPF MVVM开发框架Caliburn.Micro入门介绍①

    在CaliburnMicro中只需要按照约定把View的名字加上后缀ViewModel,就是它的View Model 的名字,如:MainPage和 MainPageViewModel。...所有参数都会自动转换为方法的签名。此机制还允许“Action.Target”独立于DataContext而变化,并允许在UI中的不同点从触发器声明它。...Screens 和Conductors Screen、ScreenConductor和ScreenCollection模式支持基于模型的活动或当前项目跟踪,强制执行屏幕生命周期,并在应用程序中优雅地关闭或取消关闭...Micro对这些模式的实现是Caliburn中的模式的演变,支持执行任何类型的类,而不仅仅是IScreen的实现。这些改进正在重新引入Caliburn。...这在任何鼓励约定而不是配置的严肃框架中都很重要。该框架的所有最重要部分都包含日志记录。想知道应用或不应用哪些约定吗?打开日志记录。想知道正在执行哪些操作吗?打开日志记录。想知道正在发布哪些事件吗?

    1.8K20

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

    当你更新LiveData对象中存储的数据时,所有注册了的Observer,只要所绑定的LifecycleOwner处于活动状态,就会被触发通知。...确保在ViewModel而不是Activity或Fragment中保存用来更新UI的LiveData对象,原因如下: 避免臃肿的Activity和Fragment。...这些UI控制器负责显示数据而不是保存数据状态。 将LiveData实例与特定Activity或Fragment实例分离,这将使得LiveData对象在配置更改后仍然存活。...由于没有Observer在监听,所以没有理由继续保持与StockManager服务的连接。 setValue(T)方法更新LiveData实例的值,并通知活动观察者有关更改。...这样做表示此Observer绑定了Lifecycle对象的生命周期,即: 1.如果Lifecycle对象不处于活动状态,则即使值发生更改,也不会调用Observer。

    2.4K30

    已中招!Android 基础面试常常吊死在这几个问题上……

    应聘者:使用 ViewModels 和的组合 onSaveInstanceState() , ViewModel 具有 LifeCycle-Aware 的功能。...换句话说,如果 ViewModel 的所有者因配置更改(例如,旋转)而被销毁,则不会销毁它。所有者的新实例将重新连接到现有的 ViewModel 。...通常的做法是将数据存储在 ViewModel 类中(因为它在配置更改期间保留数据),并使用 OnSaveInstanceState 存储少量UI数据。 面试官:回答得不错!...12、面试官:说一下 AsyncTasks 和线程他们的区别! 应聘者:应使用线程将长时间运行的操作与主线程分开,以提高性能。但是它不能被优雅地取消,并且不能处理 Android 的配置更改。...当然这些事 ViewModel 已经帮我们做了,它可以取出 Model 的数据同时帮忙处理 View 中由于需要展示内容而涉及的业务逻辑。 面试官:这是你回答过的最漂亮的一个了。

    2K20

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

    ,以便只有当它们中的任何一个可见(即处于活动状态)时才连接到系统服务。...正确处理配置更改:如果 activity 或 fragment 由于配置更改(如:设备旋转)重新创建,将会立即收到最新的有效位置数据。...转换的这种惰性运算性质允许隐式的传递生命周期相关行为,而不必添加显式的调用或依赖。 每当你认为在 ViewModel 中需要一个 Lifecycle 类时,转换可能是解决方案。...该 UI 简单的 ViewModel 可能像这样: class MyViewModel extends ViewModel { private final PostalCodeRepository...ViewModel 可以轻松获取到 LiveData 并在它们上面定义转换规则。 创建新的转换 在应用程序中可能会用到十几种不同的特定转换,但是默认是不提供的。

    1.1K30

    LiveData的优势

    不会因 Activity 停止而导致崩溃 如果观察者的生命周期处于非活跃状态(如返回栈中的 Activity),则它不会接收任何 LiveData 事件(也是通过LifecycleOwner实现的)...如果看源码会发现Observe有一个version版本号,而LiveData也有一个版本号是否调用观察者通知数据变化就是比对这两个版本号是否一致,ViewModel会保存LiveData实例,当重建时LiveData...版本号还是之前的版本号,而观察者此时重走OnCreate为0,所以可以收到上一次的数据变化通知 适当的配置更改 如果由于配置更改(如设备旋转)而重新创建了 Activity 或 Fragment...(ViewModel通过在OnDestory的时候保存到Configure属性中,当attach的时候取出这个属性里面的Viewodel赋值给组件,当Activity/Fragment重新get获取的时候拿到的就是上次的...这个具体场景就是搭配Room数据库返回LiveData的结合,之前需要手动去做逻辑变更,但现在唯一数据源是数据库只需要更改数据库即可,不需要再Activity中处理逻辑改变数据源,符合上一篇文章说到的单项数据流原则

    1.3K20

    区域设置更改和 AndroidViewModel 反面模式

    在 ViewModel 中,如果要公开来自资源(字符串、可绘制文件、颜色……)的数据,则必须着重考虑 ViewModel 对象而忽视配置更改,例如区域设置更改。...当用户更改其区域设置时,活动将重新被创建,但不创建 ViewModel 对象。 ? AndroidViewModel 是已知应用程序上下文的 ViewModel 的子类。...让我们看看跟踪器中基于此问题的示例:在系统区域设置更改时更新 ViewModel 。...如果有区域设置更改,则不会重新创建视图模型。这将导致我们的应用程序显示废弃的数据,因此只能部分本地化。...由于视图(活动、片段等)具有生命周期意识,因此它将在配置更改后重新创建,以便正确地重新加载资源。

    1.2K60

    Jetpack Compose中MVVM的实现及ViewModel和remember对比

    数据持久性: ViewModel: ViewModel 中的数据通常具有较长的生命周期,并且在配置更改(如屏幕旋转)时会被保留。...remember: remember 中的数据通常是临时性的,不会在配置更改后保留。...这对于静态数据或者不会因用户交互而改变的数据很有用。如果状态的改变不需要在组件生命周期之外持久化,remember是一个更轻量级的选择。...这对于需要跨配置更改(例如旋转屏幕)或者应用程序生命周期的状态非常有用。它会将状态保存在Bundle中,以确保状态的持久化。...ViewModel ViewModel 类是一种业务逻辑或屏幕级状态容器。它用于将状态公开给界面,以及封装相关的业务逻辑。 它的主要优点是,它可以缓存状态,并可在配置更改后持久保留相应状态。

    1.5K11
    领券