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

在使用LiveData时,为什么要在ViewModel类中双重声明变量?

LiveData是一种用于在应用程序组件(如Activity、Fragment)之间共享数据的观察者模式实现。它具有生命周期感知能力,可以自动处理界面的生命周期变化,确保数据更新的时候只通知活跃的观察者。

在ViewModel类中双重声明变量的目的是为了确保数据的一致性和可靠性。具体来说,双重声明变量的方式是将LiveData对象作为ViewModel类的成员变量,并在ViewModel类中创建一个公开的只读访问方法来获取LiveData对象。这样做的好处有以下几点:

  1. 数据隔离:ViewModel类是与界面无关的,它负责管理与界面相关的数据。通过将LiveData对象作为成员变量,可以将数据隔离在ViewModel类中,避免数据泄露和不必要的耦合。
  2. 生命周期感知:LiveData具有生命周期感知能力,可以自动处理界面的生命周期变化。通过将LiveData对象作为成员变量,可以确保LiveData对象与ViewModel类的生命周期一致,避免数据更新时通知已销毁的观察者,提高数据更新的效率和准确性。
  3. 数据更新通知:通过在ViewModel类中创建公开的只读访问方法来获取LiveData对象,可以确保外部组件只能观察LiveData对象,而无法修改LiveData对象。这样可以保证数据的一致性和可靠性,避免数据被意外修改导致界面显示异常或数据不一致的问题。

在腾讯云的相关产品中,推荐使用云原生产品来支持LiveData的使用。云原生产品是腾讯云提供的一套完整的云计算解决方案,包括容器服务、容器注册中心、容器镜像服务等。这些产品可以帮助开发者快速构建、部署和管理云原生应用,提供高可用性、弹性伸缩、自动化运维等特性。

腾讯云云原生产品介绍链接地址:https://cloud.tencent.com/product/cns

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android Jetpack系列 之LiveData

LiveData 与普通可观察不同的是LiveData具有生命周期感应能力,比如我们页面中进行网络请求结束后,需要将数据显示UI上,如果此时页面被销毁就会有空指针等异常,我们还需要在页面销毁的时候单独处理...所以我们就要做到当计数的数字发生改变,通知TextView便于TextView重新显示,如果矬一点,可能会想到将View传递到ViewModel,让ViewModel持有View的引用,这种方式确实可以实现需求...嚯嚯,pia pia 打脸 这里报错的原因是因为我们的计数demo是运行在子线程的,而LiveData的setValue方法只能在主线程调用,如果想要在子线程调动只能使用postValue方法,我们将赋值方法改为...数据的封装性,所以我们需要将这个可变类型的变量声明为私有的并且声明一个不可变的变量赋值给mCount,只对外暴露不可变的LiveData,修改model代码如下所示: private LiveData<...实际项目开发我们使用switchMap的频率还是很高的,毕竟 只要LiveData对象是调用其他方法获取的 ,我们就可以这样做, 点击事件我们设置了可观察数据:分数,当分数改变的时候,就会执行switchMap

1.1K20

知识点 | ViewModel 四种集成方式

下面的文章,我将介绍 ViewModel 的四种集成方式: ViewModel 的 Saved State —— 后台进程重启ViewModel 的数据恢复; NavGraph 中使用 ViewModel...诸如用户 id 等需要在 onSaveInstanceState 得到保存下来的数据,现在都可以存在 SavedStateHandle 。...与 Data Binding: Data Binding 中使用 ViewModelLiveData 于 Android Studio 的 3.1 版本加入 支持 Java 与 Kotlin...当 CoroutineScope 被取消,它所跟踪的所有协程都会被取消。上面的代码,我使用了 GlobalScope,正如我们不推荐随意使用全局变量一样,这种方式通常不推荐使用。...根据 LiveData 自动更新; ViewModel使用 Kotlin 协程使用 viewModelScope 来让协程 ViewModel 被销毁自动取消。

2.5K20

知识点 | ViewModel 四种集成方式

下面的文章,我将介绍 ViewModel 的四种集成方式: ViewModel 的 Saved State —— 后台进程重启ViewModel 的数据恢复; NavGraph 中使用 ViewModel...诸如用户 id 等需要在 onSaveInstanceState 得到保存下来的数据,现在都可以存在 SavedStateHandle 。...与 Data Binding: Data Binding 中使用 ViewModelLiveData 于 Android Studio 的 3.1 版本加入 支持 Java 与 Kotlin...当 CoroutineScope 被取消,它所跟踪的所有协程都会被取消。上面的代码,我使用了 GlobalScope,正如我们不推荐随意使用全局变量一样,这种方式通常不推荐使用。...根据 LiveData 自动更新; ViewModel使用 Kotlin 协程使用 viewModelScope 来让协程 ViewModel 被销毁自动取消。

24220

Android Jetpack - ViewModel

,它的生命周期感知能力需要配合 Lifecycles 组件才能实现,本文聚焦于 ViewModel 所以先不讲 Lifecycles ,关于 Lifecycles 我会在其它文章详细介绍 为什么使用 ViewModel...我用一个非常简单的 Demo 来展示它的基础用法,通常我们为 app 集成 ViewModel 遵循如下几个步骤: 1、创建一个继承 ViewModel来分离出 UI 控制器的数据 2、建立 ViewModel...: ViewModel(){} 以上面的计时器为例,我们需要 UI 保持持续更新时间的状态,所以 ViewModel 添加一个 startTime 变量用于存储不断累计的时间 class MainActivityViewModel...UI 控制器中使用 ViewModel 我们计时开始之前先将系统当前时间存入 viewModel.startTime 变量,而后每次 onCreate 被调用时,都会先取出 viewModel.startTime...的秒数,此处 elapsedTime 为 LiveData 类型,它会随着 ViewModel 初始化开始通过 Timer 自动更新,下一步我们只需要在 Activity 订阅它即可实时更新数据到

83720

7. JetpackNote---基于Jetpack的学习笔记APP

:Navigation、Lifecycles、Paging、LiveDataViewModel等… \n项目使用Kotlin语言进行编写,依赖库截止代码编写为最新版本,的几篇源码分析我们分别对Navigation...等…项目使用Kotlin语言进行编写,依赖库截止代码编写为最新版本。...即使谷歌官方推荐使用todo-mvp使用契约…,但终究那不能适合所有项目场景。但是Jetpack,它是一套组件、工具和指导;是谷歌正式推出的一整套用来构建APP开发的组件。 ?...Map转换则演示通过转换存储LiveData对象的值,并向下传递转换后的数据。...4.4 ViewModel ViewModel模块,屏幕中央为一个计时器,通过使用ViewModel存储计时器的值,将屏幕方向发生改变后,数据仍然存在不会销毁。

96930

上手指南 | Jetpack Hilt 依赖注入框架

Jetpck Dagger-Hilt 依赖注入是什么 一个里面有一个变量,这个变量就是这个的依赖。然后通过外部注入对这个变量进行赋值,这种就叫做依赖注入。...这些组件会自动集成到 Android 程序的生命周期中。使用的时候可以指定使用的范围,事情作用在对应的生命周期当中。..., viewModel 不需要手动的创建其对象 class HomeContentRepository @Inject constructor() : BaseRepository() {...需要在 fragment 和 actvity 都使用这个注解。 但是如果 activity 和 fragment 没在同一个module,就会报错。...undefined Hilt 好处 降低 Android 开发者使用依赖注入框架的上手成本 内部有一套标准的组件和作用域,对范围进行声明后,只能使用在指定的作用域中使用这个,并且提供声明周期的管理,会自动释放不在使用的对象

1.6K30

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

上述代码采用的做法是,定义一个count变量Text控件显示这个count变量的值,并且每次点击Button让count变量加1。 思路非常简单,那么这段代码能正常工作吗?...remember函数的作用是让其包裹住的变量重组的过程得到保留,从而就不会出现变量被重新初始化的情况了。...但如果你的变量并不想定义ViewModel当中,而是就得定义Composable函数,我们仍然还是有其他解决方法的。...可以看到,Counter函数移除了count变量声明,改成了使用参数传递的模式。同时,当按钮被点击,因为我们已经无法对State变量进行写入,这里改用了回调的方式将点击事件通知到上一层。...如果你早就已经不再使用LiveData,而是转向使用Kotlin Flow的话,那么你的ViewModel的代码可能是长这样的: class MainViewModel : ViewModel() {

73220

改造 Android 官方架构组件 ViewModel

应用场景很多, 比如之前 MVP 架构, 你需要在 Activity 执行 onCreate , 让 Presenter 初始化一些操作, 这时就不用在 Activity 的 onCreate...再调用 Presenter 的某个初始化方法了, 直接使用官方的生命周期组件即可完成, Activity 执行 onDestroy 需要释放一些对象的资源, 也可以使用到生命周期组件 LiveData...有两个功能, 第一个功能可以使 ViewModel 以及 ViewModel 的数据屏幕旋转或配置更改引起的 Activity 重建存活下来, 重建后数据可继续使用, 第二个功能可以帮助开发者轻易实现...的数据幸免于 Activity 重建, 所以不要在此方法获取 ViewModel Activity 的 onDestroy 方法不能获取 ViewModel, 会报错 通过 Fragment...也会出现和 Activity 一样的情况, 获取的 ViewModel 是重新构建后的新实例, ViewModel 以及 ViewModel 的数据不能幸免于 Activity 重建, 所以也不要在此方法获取

74310

Android技术栈(四)Android Jetpack MVVM 完全实践

因为现在kapt还有很多Bug,使用kapt,Windows下DataBinding格式下的xml如果包含有中文,会报UTF-8相关的错误....`This a string`}" 自动导入的context变量,你可以xml的任意表达式使用context这个变量,该Context是从该布局的根View的getContext获取的,如果你设置了自己的...设置的变量他会在这个为你生成对应的Getter和Setter.你可以调用它们给界面赋值,比如之前的我们定义的action....以一个枚举抽象出来定义Lifecycle。...4 LiveData LiveData是对Android组件生命周期感知的粘性事件,也就是说,LiveData持有数据,你去订阅它就能收到他最后一次接收到的数据.实战,我们能用到的LiveData

3.8K01

上手指南 | Jetpack Hilt 依赖注入框架

Jetpck Dagger-Hilt 依赖注入是什么 一个里面有一个变量,这个变量就是这个的依赖。然后通过外部注入对这个变量进行赋值,这种就叫做依赖注入。...这些组件会自动集成到 Android 程序的生命周期中。使用的时候可以指定使用的范围,事情作用在对应的生命周期当中。...的使用 使用之前需要在 app.build 下添加一下对 viewModel的支持 implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0...需要在 fragment 和 actvity 都使用这个注解。 但是如果 activity 和 fragment 没在同一个module,就会报错。...Hilt 好处 降低 Android 开发者使用依赖注入框架的上手成本 内部有一套标准的组件和作用域,对范围进行声明后,只能使用在指定的作用域中使用这个,并且提供声明周期的管理,会自动释放不在使用的对象

1.6K20

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

前言 ViewModelLiveData最早是Google提出的AAC架构的重要成员,那么它为什么又和协程扯上关系了呢?...其实不能叫扯上关系吧,ViewModelLiveData属于「架构组件」,而协程是「异步工具」,ViewModelLiveData搭上了协程这条快车道,让Google推了几年的AAC架构更加快的让人接受了...只提供了map、switchMap等有限的处理能力 粘性事件问题:LiveData注册,会触发LifecycleOwner的activeStateChanged,触发了onChange,导致注册前的事件也被发送出来...❝LiveData能避免内存泄漏的根本原因是它与Lifecycles绑定,非活跃状态移除观察者,而Activity和Fragment都是LifecycleOwner,所以Activity和Fragment...前面我们说了,要在ViewModel准备好UI层所需要的数据,也就是要在ViewModel请求数据,再通过LiveData回调给UI层。

1.1K40

ViewModels and LiveData- Patterns + AntiPatterns

❌ 避免ViewModels对View进行引用。 ViewModels和View之间进行通信的推荐方式是观察者模式,使用LiveData或来自其他库的观察变量方式。...ViewModel配置变化时被持久化,所以当重新请求发生,不需要重新查询外部数据源(如数据库或网络)。 当长期运行的操作结束ViewModel的观察变量会被更新。数据是否被观察并不重要。...参见我们样本的资源:https://developer.android.com/jetpack/guide#addendum。 ✅使用包装器或另一个LiveData暴露你的数据的状态信息。...所以,状态被保存在ViewModel是安全的。 然而,你可能需要在ViewModels也消失的其他情况下恢复状态:例如,当操作系统资源不足并杀死了你的进程。...使用LiveData存储库和ViewModel之间进行通信,其方式类似于View和ViewModel之间使用LiveData。 这点用Flow也可以解决。

1.1K30

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

源码分析: 3.1 observer() 我们声明了一个LiveData对象,并通过监听Fragment的生命周期来改变LiveData的value值,LiveData实际上就像一个容器,Demo存储了一个...LiveData的代码很简洁,400多行的代码,看起来也并不费劲,下面我们来分析下整个流程: 通过使用LiveData对象,为它创建观察者Observer 创建Observer绑定Fragment生命周期...,可以帮助我们实现这样的场景: 通过**Transformations.map()**使用一个函数来转换存储 LiveData对象的值,并向下传递转换后的值: LiveDataViewModel...Observer会以Source的成员变量的形式,添加到传入的LiveData。...(),那么此时你调用这个LiveData的postValue(…)/value=…,是没有任何作用 当然官方推荐我们LiveData配合ViewModel一起使用,因为LiveData一般都出现在ViewModel

99720

Android 面试题:为什么 Activity 都重建了 ViewModel 还存在?—— Jetpack 系列(3)

认识 ViewModel 1.1 为什么使用 ViewModel?...具体来说,使用 ViewModelProvider ,我们需要传入一个 ViewModelStoreOwner 宿主接口,它将在 getViewModelStore() 接口方法返回一个 ViewModelStore...基于以上考虑,Activity 是支持设备配置变更重建恢复 第 2 - 非配置数据 的,源码存在 NonConfiguration 字眼的代码,就是与这个机制相关的代码。...映射表); LiveData: 保留旧的实例(因为 LiveDataViewModel 的成员变量); 现在,我们逐一分析这 3 个阶段的源码执行过程: 阶段 1 源码分析: Activity.java...的 Transformations.switchMap() API 包装数据层的请求方法,这相当于 ViewModel 和数据层中间使用 LiveData 进行通信。

1.1K20

【Jetpack】Room + ViewModel + LiveData 综合使用 ( 核心要点说明 | 组合方式 | 代码示例 )

与 数据模型 Model 之间 数据交互的 桥梁 ; LiveData 是基于 ViewModel 的 , 是 对 ViewModel 数据维护的一个补充 ; ViewModel使用LiveData...单例对象初始化时创建数据库 ; Room 框架的 Dao 数据库访问对象接口 的定义方式需要作出改变 , 涉及到数据库查询的 接口方法 , 其返回值需要 返回 LiveData 类型 , 泛型设置为..., 并且需要在维护 Repository 成员变量 , class ViewModel: AndroidViewModel { lateinit var repository: Repository...ViewModel 使用要点 Activity 组件 , 通过调用 ViewModel 视图模型获取 数据库的数据 , ViewModel 调用 Repository 层的增删改查方法 , Repository..., 首次设置 Observer 监听 , 会回调一次, 首次查询 , 数据库为空 , 没有查到任何数据 , 最终得到 [] 打印结果 ; // 为 ViewModel 获取的 LiveData

65520

是时候更新手里的武器了—Jetpack架构组件简析

数据绑定 “数据绑定库是一种支持库,借助该库,您可以使用声明性格式(而非程序化地)将布局的界面组件绑定到应用的数据源。...所有的要在Activity里面管理,还容易漏掉。所以解决办法就是实现解耦,让需要管理生命周期的自己管理,这样Activity也不会遗漏和臃肿了。...ORMLite主要在获取参数属性值的时候,是通过反射获取的,所以速度较慢。GreenDao构造sql语句的时候是通过代码拼接,所以较慢。...” 终于说到ViewModel了,其实之前的demo都用了好多遍了,ViewModel主要是从界面控制器逻辑中分离出视图数据,为什么要这么做呢?...官方文档 Demo代码地址 WorkManager “使用 WorkManager API 可以轻松地调度即使应用退出或设备重启仍应运行的可延迟异步任务。

2.9K20

Android 架构组件 - 让天下没有难做的 App

后来我们开始使用 RxJava,响应式编程,声明式写法,再借助 retrolambda 这种 backport,即使当年 Android 只支持到 JDK7,我们依然可以利用各种 operator 写出非常简洁的代码...如果 ViewModel 要用到 context 怎么办呢?...除此之外,ViewModel 也可以用做 MVVM 模式的 VM 层,利用 Data Binding 直接把 ViewModelLiveData 属性绑定到 xml 元素上,xml 声明式的写法避免了很多样板代码.../Java 来操控 UI: <TextInputEditText android:text="@={<em>viewModel</em>.commentText}" /> 注意,如果要在 xml 中使用 LiveData...上图表达了数据的流向,如果从 UI 层往回看,页面展示的数据存储 PagedList ,PagedList 只是 DataSource 的数据块(chunk),当 PagedList 需要更多数据

1.2K20

livedatabus详解,阿里是如何用他来做淘宝架构的?

如果 ViewModel 要用到 context 怎么办呢?没关系,框架提供了一个 ViewModel 的子类AndroidViewModel,它在构造需要传入Application实例。...除此之外,ViewModel 也可以用做 MVVM 模式的 VM 层,利用 Data Binding 直接把 ViewModelLiveData 属性绑定到 xml 元素上,xml 声明式的写法避免了很多样板代码.../Java 来操控 UI: <TextInputEditText android:text="@={<em>viewModel</em>.commentText}" /> 注意,如果要在 xml 中使用 LiveData...,都提供了很多声明式的操作符,对流的支持都比较友好,而LiveData本身不是一个流,所以这两个操作符足矣。...上图表达了数据的流向,如果从 UI 层往回看,页面展示的数据存储 PagedList ,PagedList 只是 DataSource 的数据块(chunk),当 PagedList 需要更多数据

1.1K30

ViewModelLiveData:为设计模式打 Call 还是唱反调?

❌ 不要让 ViewModel(或Presenter)直接使用 Android 框架内的 条件语句、循环和一般的判定等语句应该在 ViewModel 或者应用程序的其他层完成,而不是 Activity...可以将中有状态和其他元数据(比如错误信息)的数据封装到一个。参见示例代码的 Resource 。 ✅ 使用一个包装或者 LiveData 来暴露状态信息。...旋转屏幕是最明显的情况,我们已经 ViewModel 部分提到了。保存在 ViewModel 的状态是安全的。 但是,你可能需要在其他 ViewModel 也消失的场景恢复状态。...示例,我们继承 LiveData 创建一个叫做 SingleLiveEvent 的来解决这个问题。它仅仅发送发生在订阅后的更新,要注意的是这个只支持一个观察者。...✅ 当需要在 ViewModel 需要 Lifecycle 对象使用 Transformation 可能是个好办法。

3K30
领券