ViewModel 被设计用来以与生命周期相关的方式保存和管理 UI 相关的数据。ViewModel 允许数据在例如屏幕旋转这样的配置更改后依然保留。...也就是说即便你的应用在由于资源限制而被终止或者设备电量用完了的时候数据也将会被保存下来。...注意,很多 UI 数据会自动地被保存和恢复: “该方法的默认实现保存了关于 activity 的视图层次状态的临时信息,例如 EditText 控件中的文本或者 ListView 控件中的滚动条位置。”...此外,Loader 可以在配置更改期间保留,比如说在加载的过程中你旋转了手机屏幕。这听起来很耳熟吧!...在这个场景下,ViewModel 在 activity 旋转或者进入后台时仍保留数据,而单纯用 onSaveInstanceState() 并没那么容易实现。
ViewModel 允许数据在例如屏幕旋转这样的配置更改后依然保留。...ViewModel 被设计用来以与生命周期相关的方式保存和管理 UI 相关的数据。ViewModel 允许数据在例如屏幕旋转这样的配置更改后依然保留。...也就是说即便你的应用在由于资源限制而被终止或者设备电量用完了的时候数据也将会被保存下来。...此外,Loader 可以在配置更改期间保留,比如说在加载的过程中你旋转了手机屏幕。这听起来很耳熟吧!...在这个场景下,ViewModel 在 activity 旋转或者进入后台时仍保留数据,而单纯用 onSaveInstanceState() 并没那么容易实现。
在这个应用的开发过程中,我使用了 Android 的三个重要组件:Fragment、ViewModel 和 View Binding。下面,我将详细介绍这三者的关系以及如何实现具体功能的代码。1....其主要作用是持久化数据,使其能够在 Fragment 或 Activity 的生命周期变化(如屏幕旋转)时依然可用。在我们的应用中,HomeViewModel 用于管理文本数据和句子划分的逻辑。...和 View Binding 之间的关系如下:Fragment:负责管理 UI 和用户交互逻辑,通过 ViewModel 获取和存储数据,使用 View Binding 直接访问布局中的视图。...ViewModel:负责存储和管理与 UI 相关的数据,确保数据在生命周期变化时的持久性。View Binding:简化了视图的访问,提高了代码的安全性和可读性。...总结通过使用 Fragment、ViewModel 和 View Binding,我们可以创建一个简化小说内容分享的应用。
ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存。...QuizViewModel和MainActivity步调一致 设备旋转时,ViewModel 也留在了内存里。...MainActivity和QuizViewModel经历设备旋转 运行GeoQuiz应用日志: 初次打开 旋转设备日志:(可以看出viewmodel并未重建,而是从内存中直接取第一次创建的) 旋转后...三、进程销毁时保存数据 上面讲述的是发生屏幕旋转等配置更改的情况下,activity会被销毁和重启,这个时候可以用viewmodel来自动保存数据与获取数据。...因此,要处理设备配置更改 加上 系统发起的进程终止 两种情况,就结合使用 ViewModel 和 onSaveInstanceState() 方式来保存数据状态。
ViewModel 和 LiveData 是 Android Jetpack 组件库中的两个核心组件,它们能帮助开发者更有效地管理 UI 相关的数据,并且能够在配置变更(如屏幕旋转)时保存和恢复 UI...用于ViewModel数据返回时通知View更新,是ViewModel和View之间的桥梁 那么如何在 Kotlin 中正确优雅地使用 ViewModel 和 LiveData 呢。...创建 ViewModel 类 ViewModel 用于存储和管理与 UI 相关的数据,它能在配置变更时继续存在。...更新和观察数据 当通过 ViewModel 来更新数据时,观察者会自动收到通知并更新相应的 UI 组件。...平时像上面例子中和LiveData、ViewModel一起使用的比较多 总结 通过 ViewModel 、 LiveData,可以实现数据的生命周期感知,并且在配置变更(如设备旋转)时也能保持 UI
什么是ViewModel ViewModel是Android Jetpack组件之一,它的主要目的是将UI控制器(如Activity和Fragment)与数据相关的业务逻辑分开,使得UI控制器能够专注于展示数据和响应用户交互...ViewModel的原理 ViewModel的原理其实并不复杂。在设备配置发生变化(如屏幕旋转)导致Activity或Fragment重建时,ViewModel不会被销毁,而是保留在内存中。...这样,UI控制器可以在重建后重新获取之前的ViewModel实例,并继续使用其中的数据,从而避免数据丢失和重复加载。...ViewModel与SavedState 有时,我们可能希望在ViewModel中保存一些与UI控制器生命周期无关的数据,以便在重建时恢复状态。...当数据量较大或需要跨进程共享数据时,应该考虑使用其他解决方案,如Room数据库或SharedPreferences。
包含以下几个组件模块: lifecycle 处理生命周期,创建一个自动响应生命周期事件的用户界面 LiveData 构建底层数据库更改时通知试图的数据对象(数据驱动界面) ViewModel 存储未在应用旋转中销毁的...UI相关数据 Room 使用应用内对象和编译时检查来访问您的应用的SQLite数据库 Paging 逐步从数据源加载所需的信息 整体结构如下: ?...ViewMode管理数据 ViewModel是以关联生命周期的方式来存储和管理UI相关的数据的类,即使configuration发生改变(比如旋转屏幕),数据仍然可以存在不会销毁。...并且当Activity或Fragment重建的时候,ViewModel会自动保留之前的数据并给新的Activity或Fragment使用。 ?...总是最新的数据——当Activity从后台切到前台时,总会收到最新的数据。 适配设备配置变化——如屏幕旋转,组件销毁重建后,立即收到上次的数据。
最终的App有一个bug,如果你旋转手机,当前保存的分数会莫名归零。 ? 这是什么原因呢?因为旋转设备会导致 App 中一些 配置发生改变 ,比如键盘是否可用,变更设备语言等。...这种表现可以让我们在做一些特殊处理,比如设备旋转时变更为横向特定布局。 然而对于新手(有时候老鸟也是)工程师来说,这可能会让他们头疼。...Activity 的生命周期中,onCreate可能会被调用多次,比如当应用程序被旋转时,但 ViewModel 会一直存在,不会被重建。...第三步:在 UI 控制器中使用 ViewModel 要访问或更改UI数据,可以使用ViewModel中的数据。...使用LiveData 的额外好处是它是可观察的:它可以在数据改变时触发UI更新。可以在这里了解更多关于LiveData的信息。
数据持久性: ViewModel: ViewModel 中的数据通常具有较长的生命周期,并且在配置更改(如屏幕旋转)时会被保留。...remember: remember 中的数据通常是临时性的,不会在配置更改后保留。...用法: ViewModel: 通常通过在 Activity 或 Fragment 中使用 ViewModelProvider 获取 ViewModel 实例,并在需要时观察 ViewModel 中的 LiveData...或使用它提供的数据。...这意味着在 activity 之间导航时或进行配置更改后(例如旋转屏幕时),界面将无需重新提取数据。
很简单,比如一个EditText,需求是EditText改变的时候,user对象name数据也会跟着改变,只需要把之前的"@{}"改成"@={}" //布局 activity_main.xml...}) } } 这是一个股票数据对象,StockManager为股票管理器,如果该对象有活跃观察者时,就去监听股票市场的情况,如果没有活跃观察者时...官方文档 Demo代码地址 ViewModel “ViewModel 类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存。...对了,数据通信。不同的 Fragment 可以使用其父Activity共享ViewModel 来进行数据的通信,厉害吧。还有很多其他的用法,去项目中慢慢发现吧!...官方文档 Demo代码地址 WorkManager “使用 WorkManager API 可以轻松地调度即使在应用退出或设备重启时仍应运行的可延迟异步任务。
前面几篇笔记讲了那么多内容,都是基于静态界面的展示来说的,即给我一个不变的数据,然后将它展示出来。如何在 Compose 中构建一个随数据而变化的动态界面呢?相信看完这篇就知道了。...虽然提出了许多架构思想,如 MVC、MVP、MVVM 等,一定程度上解耦了界面与数据处理逻辑,但是架构本身就具有一定的复杂性,且对于后续维护成本也相对较高,所以 Compose 一开始就将界面与数据分开来...,而且在 Activity、Fragment 重建时 ViewModel 中的数据是不受影响的。...ViewModel 经常与 LiveData 一起使用,但在 Compose 中,推荐使用 MutableState 来具体存储数据的值。...再回到这个例子,使用 remember 关键字就可以避免每次重组时都初始化为初始值。
(作用) ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存。(特点) 到这里,你可能还是不清楚ViewModel到底是干啥的,别急,往下看。...看到在因屏幕旋转而重新创建Activity后,ViewModel对象依然会保留。只有Activity真正Finish的时ViewModel才会被清除。...在之前 你可能会定义接口或者使用EventBus来实现数据的传递共享。 现在就可以使用 ViewModel 来实现。...那么和 使用ViewModel恢复数据 有哪些区别呢?...而使用ViewModel恢复数据 则 只有在 因配置更改界面销毁重建 的情况。
状态变化:当用户与界面交互(如点击按钮)时,会触发状态的变化。 状态存储:状态在这里被存储和管理。在 Compose 中,这通常是通过 MutableState 或 ViewModel 来实现。...这个流程图展示了从用户交互到状态变化,再到 UI 更新的完整流程,清晰地描绘了数据如何在应用中流动。...我们将使用 ViewModel 来管理用户的个人资料信息和帖子列表,以确保这些数据在配置更改(如设备旋转)时仍然保持不变,并且使得数据处理逻辑与 UI 逻辑分离,增强代码的可维护性。...这通常涉及到对列表数据的操作,如添加、删除或修改列表项,以及响应用户的交互事件。下面,我们将通过一个具体的例子来展示如何在 Compose 中处理列表中的状态和事件。...通过这些策略,可以显著提高长列表的性能,确保应用即使在数据量大或设备性能有限的情况下也能保持流畅的用户体验。 五、Compose 最佳实践详解与代码示例 实际使用中,我们还会遇到很多性能问题。
1、数据倒灌的出现 场景: 如果我们在一个home页面获取网络数据,然后通过LiveData的观察者特性,在回调中跳转B页面,当旋转屏幕时,页面重建,LiveData又发来最后一次数据,那么直接触发了跳转...在页面重建时,LiveData自动推送最后一次数据供我们使用。 官方描述:ViewModel 将数据保留在内存中,这意味着开销要低于从磁盘或网络检索数据。...ViewModel 与一个 Activity(或其他某个生命周期所有者)相关联,在配置更改期间保留在内存中,系统会自动将 ViewModel 与发生配置更改后产生的新 Activity 实例相关联。...由于LiveData本身的特性,Activity的生命周期由非活跃变成活跃时,LiveData会触发事件分发,导致屏幕旋转或者切换系统语言后出现数据倒灌。...如果当前Activity回到前台LiveData不需要接收最新的数据,可以使用下面三中扩展的LiveData 官方扩展的SingleLiveEvent 美团反射修改mVersion UnPeek-LiveData
所以我们就要做到当计数的数字发生改变时,通知TextView便于TextView重新显示,如果矬一点,可能会想到将View传递到ViewModel中,让ViewModel持有View的引用,这种方式确实可以实现需求...来使用,之前的Main3ActivityModel代码如下所示: public class Main3ActivityViewModel extends ViewModel { public...this.mCount.setValue(count); } } LiveData类型的变量我们通过set和get去赋值和取值 现在计数的数字已经是LiveData类型的了,那么我们如何在数据变化的时候通知...ok,这样的话 我们就使用LiveData实现上面的需求了,但是有没有感觉有什么问题呢,问题就是这个mCount可变类型的数据暴露给了外部,导致我们在ViewModel外也是可以赋值的,这样违反了ViewModel...setStudentMutableLiveData来模拟数据的获取,正常情况下我们需要在ViewModel去请求网络数据进行设置 我们在Main4Activity中直接进行数据设置操作: private
android系统提供了驱动程序去管理这些传感器硬件,当外部环境发生改变时,android系统会通过传感器获取外部环境的数据,并将数据传给监听器的监听方法。...0-180);第二个角度:表示手机顶部或尾部翘起的角度(x轴旋转-180-180); 第三个角度:表示手机左侧或者右侧翘起的角度(y轴旋转-90-...90) 磁场传感器(Magnetic Field):三个数据分别代表周围磁场分解到x,y,z三个方向上的磁场分量,单位微特斯拉(uT) 温度传感器(Temperature):代表手机设备周围的温度,...onResum()方法中为指定类型的传感器注册监听器,本程序为6种类型的传感器注册了监听器,实现了onSensorChanged(SensorEvent event)方法就是实现传感器监听器,实现监听器方法时即可获取传感器所传回来的数据...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
ViewModel介绍 ViewModel是用来保存并且管理与LifeCycle以及UI相关数据的数据结构。...ViewModel允许数据在Configuration改变时(比如屏幕旋转)保存,并且在旋转后恢复。 UI Controller相关的Android框架则是Activity与Fragment。...例如你的APP可能包括了很多用户的数据,当Activity因为Configuration改变而重建时,新的Activity需要重新获取这些数据,而一般会使用onSaveInstanceState方法保存...,并且使用onCreate中的Bundle进行恢复,但是这种只适合非常小并且实现了序列化以及反序列化的数据,而不能保存大数据,比如Bitmap等。...在ViewModel中提供数据来源repository,如Room或者网络 在数据返回后,使用LiveData向UI Controller提供UI相关数据 public class MyViewModel
而使用了State来追踪某个数据之后,当这个数据的值发生变化,Compose就会自动触发重组来更新所有读取这个值的地方,从而界面就会得到更新了。...而手机横竖屏旋转会导致Activity重新创建,这个时候数据肯定是会丢失的。 当然这个问题并不是Compose独有的,因为View也会面临同样的问题。...而解决这个问题的办法有很多,比如说我们都知道,ViewModel的生命周期是可以跨越手机横竖屏旋转的,存放在ViewModel中的数据即使Activity因为横竖屏旋转而重新创建也不会丢失。...这个方案之前在View系统中就被广泛使用,在Compose当中也仍然有效。我们稍后就会讲解如何在Compose中使用ViewModel。...rememberSaveable函数是remember函数的一个增强版,它唯一和remember不同的地方就是在于其包裹的数据在手机横竖屏旋转时会被保留下来。
此外生命周期管理同时也已集成到支持库中(Support Library),因此开发者也可以在标准类别里,如 AppCompatActivity 中使用这些 API。...LiveData 为界面代码 (Observer)的监视对象 (Observable),当 LiveData 所持有的数据改变时,它会通知相应的界面代码进行更新。...了解更多 LiveData 相关内容: developer.android.google.cn/topic/libra… ViewModel ViewModel 将视图的数据和逻辑从具有生命周期特性的实体...直到关联的 Activity 或 Fragment 完全销毁时,ViewModel 才会随之消失,也就是说,即使在旋转屏幕导致 Fragment 被重新创建等事件中,视图数据依旧会被保留。...它的一些功能,如编译时的数据查询验证、内置迁移支持等,让开发者能够更简单地构建健壮的持久层。而且 Room 可以和 LiveData 集成在一起,提供可观测数据库并感知生命周期的对象。
Commands 定义了对 Model 选定数据的一些操作,如删除、修改、保存等操作。Selections 可以理解为就是对 Model 数据集的筛选过滤,根据条件取子集。...该架构图没提到 DataBinding,但我们会使用到。我们将用 DataBinding、ViewModel、LiveData 三者结合来实现数据绑定的需求。...首先,我们继承了 ViewModel,这是 Jetpack 提供的组件,其用途是封装界面控制器(如 Activity 和 Fragment)的数据,以使数据在配置更改后仍然存在。...直白的意思就是,将界面和数据进行分离,这也是 MVVM 的一个关键思想。如果不分离,假如旋转了设备屏幕,那需要我们自己去做数据保存和恢复的工作。...设置时,如果@后面不加等号,那就只是单向绑定,只能由 ViewModel 将数据变化通知到界面。加了等号,才是双向绑定,即界面上的数据改变才能传递给到 ViewModel。
领取专属 10元无门槛券
手把手带您无忧上云