Android架构组件LiveData+ViewModel
前言
最近项目中有用到LiveData+ViewModel的架构组件,今天来学习一波。本篇文章参考:MVVM 架构,ViewModel和LiveData 所有语言为Kotlin。
LiveData
LiveData是一个可以被观察的数据持有者.这也就意味着应用中的组件能够观察LiveData对象的更改,而无需在它们之间创建明确的和严格的依赖关系。这将完全分离LiveData对象使用者和LiveData对象生产者。 除此之外,LiveData还有一个很大的好处,LiveData遵守应用程序组件(活动,片段,服务)的生命周期状态,并进组件的生命周期管理,确保LiveData对象的内存泄漏。 注:上述的遵守应用程序组件的生命周期是指,譬如说Activity的生命周期在onStart、onResume的状态下是可以接收到LiveData内的数据变化回调的。而在Stop之后数据变化不会进行回调。而且在Activity销毁的时候,LiveData也会随之销毁,简单理解为它和Activity的生命周期类似,这也防止了内存泄漏。
在开发中我们多用的是继承LiveData的子类MutableLiveData。里面还有两个方法,setValue和postValue,setValue必须在主线程调用。postValue可以在后台线程中调用。
ViewModel
ViewModel是和Model(数据层)进行交互,并且ViewMode可以被View观察.ViewModel可以选择性地为视图提供钩子以将事件传递给模型.该层的一个重要实现策略是将Model与View分离,即ViewModel不应该意识到与谁交互的视图。
通俗地来说,ViewModel所承担的职责就是UI层与数据层的中间层。
- 一方面可以减轻View层的逻辑,View层可以更好的针对UI做设置而无需考虑其他逻辑。
- 另一方面ViewModel作为View和Model的中间层,将View和Model解耦合。
此外,ViewModel还有一个比较厉害的功能,通常情况下activity会被系统自动销毁,此时我们用于保存数据的方式就是事先在onSaveInstanceState()方法中规定好需要存储的数据。但是这种做法有一个缺点就是保存的数据要经过序列化。使用ViewModel的话ViewModel会自动保留之前的数据并给新的Activity或Fragment使用。直到当前Activity被系统销毁时,Framework会调用ViewModel的onCleared()方法,我们可以在onCleared()方法中做一些资源清理操作。
使用ViewModel+LiveData编写一个简易demo
1、首先我们需要编写一个实体类,用于数据的封装:
data class AccountBean( val name:String = "", val number:String = "")
2、创建一个自定义的ViewModel:
`class AccountModel : ViewModel() {val accountLiveData = MutableLiveData<AccountBean>()fun getData(){accountLiveData.value = AccountBean("cyber","2077")}override fun onCleared() {super.onCleared()}
}`
复制代码
在这个ViewModel里面我们定义了一个MutableLiveData的对象其本质就是一个LiveData,而这个LiveData里的数据绑定的是刚刚我们定义的实体类型AccountBean。 getData方法是用于模拟数据更新的,当调用此方法时,我们会设置上述的LiveData里的数据内容。上述的accountLiveData.value实际上是调用了MutableLiveData里的setValue方法。
3、View层的编写 接下来就是View层了,其实就是Activity层
xml:
`<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="8dp"android:layout_marginBottom="8dp"android:text="Hello World!"app:layout_constraintBottom_toTopOf="@+id/button"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_chainStyle="packed" /><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="40dp"android:layout_marginStart="8dp"android:layout_marginTop="217dp"android:layout_marginEnd="8dp"android:layout_marginBottom="8dp"android:text="Button"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/text" /></android.support.constraint.ConstraintLayout>`
复制代码
kotlin:
`class MainActivity : AppCompatActivity() {private lateinit var mAccountModel:AccountModeloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)//初始化ViewModelmAccountModel= ViewModelProviders.of(this).get(AccountModel::class.java)//点击按钮后更新LiveData的数据实体button.setOnClickListener{mAccountModel.getData()}//设置LiveData的观察者相应更新TextViewmAccountModel.accountLiveData.observe(this, Observer {text.setText("名字:${it!!.name},号码:${it!!.number}")})}
}`
复制代码
界面很简单,就是一个TextView和一个Button。 首先我们需要将刚刚写好的ViewModel作为对象创建出来然后再onCreate时候初始化,这里需要注意的是Kotlin默认定义对象时需要初始化,所以这里使用lateinit关键字来声明对象需要延迟初始化。 点击按钮的时候,我们模拟数据更新调用刚刚在自定义ViewModel中的getData方法更新LiveData里的数据。 此处我们注册了LiveData的观察模式,当数据发生变化时会回调上述的observe方法,而在Observer对象中其实是有一个onChange方法的,上述的it代表的其实就是刚刚改变的那个数据(AccountBean对象)。
Android架构组件LiveData+ViewModel相关推荐
- Android架构组件(二):LiveData
前言 上篇文章我们分析了Lifecycle的使用和原理,相信我们已经学会了用Lifecycle将你所需的类添加声明周期管理,如果只是寥寥阅读也没关系,这里奉上(双膝跪地)上篇地址,Android架构组 ...
- Android架构组件(三)——ViewModel
Android架构组件(三)--ViewModel 上一篇文章讲到了Android架构组件之LiveData(Android架构组件(二)--LiveData),现在我们再来看看另一个成员ViewMo ...
- Android架构组件-App架构指南
Android架构组件-App架构指南 Android架构组件-WorkManager Android架构组件- Room数据库的使用 Android架构组件-Lifecycle Android架构组 ...
- Android架构组件-Architecture Components
英文原文链接: https://google-developer-training.github.io/android-developer-advanced-course-concepts/unit- ...
- Android Jetpack组件之ViewModel使用
1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...
- 字节跳动Android金三银四解析:Android架构组件Room功能详解,深度好文
前言 很多公司在招人这件事情上都会面临一个问题: "我们的招聘要求又不高,能做项目就行,但为什么就是招不到人?" 很多公司还面临一个问题,招聘的时候这人各方面都不错,但上岗了就是不 ...
- 【大揭秘】Android架构组件ViewModel来龙去脉
ViewModel是google官方的MVVM架构组件,目前已经集成到了最新的支持库中了,是MVVM架构的核心组件之一.不懂MVVM的请看之前的文章:(一)Android官方MVVM框架实现组件化之整 ...
- 深圳腾讯内部Jetpack宝典意外流出!极致经典,堪称Android架构组件的天花板
简介 Jetpack是一套库.工具和指南,可以帮助开发者更轻松地编写优质应用.这些组件可以帮助开发者遵循最佳做法.让开发者摆脱编写样板代码的工作并简化复杂任务,以便开发者将精力集中放在所需的代码上. ...
- Android 架构组件 - 让天下没有难做的 App
Google 为了帮助 Android 开发者更快更好地开发 App,推出了一系列组件,这些组件被打包成了一个整体,称作 Android Jetpack,它包含的组件如下图所示: 老的 support ...
最新文章
- 基于XFS的NAS数据恢复可以做了
- Norse Attack Map网络攻击实时监测地图
- 微软、UIUC韩家炜组联合出品:少样本NER最新综述
- go gorm 密码隐藏_掀开华为云的Go语言编程底座!有深度、有点难、需细品(上)...
- P4705 玩游戏(生成函数,多项式ln)
- 如何在Linux上部署一个简单的Django项目
- 【译文】R语言中的离群值检测和处理
- 5.hbase表新增数据同步之add_peer
- (5)全局异常捕捉【从零开始学Spring Boot】
- pdo怎么建mysql表_PDO操作数据库的基本步骤
- 使用layui实现表格制作
- android post请求时报415错误,post请求传递JSON数据类型(415错误解决)
- xpath 解析后和原网页结构不一致
- 【Python】 matplotlib 以pdf形式保存图片
- 【甘肃银行:进一步加大在区块链等领域的布局】GBCAX
- 软件测试高频面试题(2023全新版)你必须掌握的面试技巧,包含HR面试、基础面试、JMeter面试、Postman面试、Python面试、自动化化面试、安全性能面试题
- Rviz中控制机器人模型运动(arbotix)
- ClickHouse settings final
- 罗斯柴尔德投资公司增加对GBTC的投资
- 医院客户关系管理/医院随访/CRM/HCRM