前言

最近项目中有用到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相关推荐

  1. Android架构组件(二):LiveData

    前言 上篇文章我们分析了Lifecycle的使用和原理,相信我们已经学会了用Lifecycle将你所需的类添加声明周期管理,如果只是寥寥阅读也没关系,这里奉上(双膝跪地)上篇地址,Android架构组 ...

  2. Android架构组件(三)——ViewModel

    Android架构组件(三)--ViewModel 上一篇文章讲到了Android架构组件之LiveData(Android架构组件(二)--LiveData),现在我们再来看看另一个成员ViewMo ...

  3. Android架构组件-App架构指南

    Android架构组件-App架构指南 Android架构组件-WorkManager Android架构组件- Room数据库的使用 Android架构组件-Lifecycle Android架构组 ...

  4. Android架构组件-Architecture Components

    英文原文链接: https://google-developer-training.github.io/android-developer-advanced-course-concepts/unit- ...

  5. Android Jetpack组件之ViewModel使用

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  6. 字节跳动Android金三银四解析:Android架构组件Room功能详解,深度好文

    前言 很多公司在招人这件事情上都会面临一个问题: "我们的招聘要求又不高,能做项目就行,但为什么就是招不到人?" 很多公司还面临一个问题,招聘的时候这人各方面都不错,但上岗了就是不 ...

  7. 【大揭秘】Android架构组件ViewModel来龙去脉

    ViewModel是google官方的MVVM架构组件,目前已经集成到了最新的支持库中了,是MVVM架构的核心组件之一.不懂MVVM的请看之前的文章:(一)Android官方MVVM框架实现组件化之整 ...

  8. 深圳腾讯内部Jetpack宝典意外流出!极致经典,堪称Android架构组件的天花板

    简介 Jetpack是一套库.工具和指南,可以帮助开发者更轻松地编写优质应用.这些组件可以帮助开发者遵循最佳做法.让开发者摆脱编写样板代码的工作并简化复杂任务,以便开发者将精力集中放在所需的代码上. ...

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

    Google 为了帮助 Android 开发者更快更好地开发 App,推出了一系列组件,这些组件被打包成了一个整体,称作 Android Jetpack,它包含的组件如下图所示: 老的 support ...

最新文章

  1. 基于XFS的NAS数据恢复可以做了
  2. Norse Attack Map网络攻击实时监测地图
  3. 微软、UIUC韩家炜组联合出品:少样本NER最新综述
  4. go gorm 密码隐藏_掀开华为云的Go语言编程底座!有深度、有点难、需细品(上)...
  5. P4705 玩游戏(生成函数,多项式ln)
  6. 如何在Linux上部署一个简单的Django项目
  7. 【译文】R语言中的离群值检测和处理
  8. 5.hbase表新增数据同步之add_peer
  9. (5)全局异常捕捉【从零开始学Spring Boot】
  10. pdo怎么建mysql表_PDO操作数据库的基本步骤
  11. 使用layui实现表格制作
  12. android post请求时报415错误,post请求传递JSON数据类型(415错误解决)
  13. xpath 解析后和原网页结构不一致
  14. 【Python】 matplotlib 以pdf形式保存图片
  15. 【甘肃银行:进一步加大在区块链等领域的布局】GBCAX
  16. 软件测试高频面试题(2023全新版)你必须掌握的面试技巧,包含HR面试、基础面试、JMeter面试、Postman面试、Python面试、自动化化面试、安全性能面试题
  17. Rviz中控制机器人模型运动(arbotix)
  18. ClickHouse settings final
  19. 罗斯柴尔德投资公司增加对GBTC的投资
  20. 医院客户关系管理/医院随访/CRM/HCRM

热门文章

  1. Android开发之多Fragment切换优化
  2. PHP学习笔记-流程控制语句
  3. Widget上实时刷新图片,造成anr问题
  4. 【Gradle】管理库工程release及debug
  5. 一张图搞定Android学习路线
  6. Microsoft Azure 云存储服务概念
  7. C#定时清理内存,net网页端可以尝试使用
  8. SpringMVC学习(二)——SpringMVC架构及组件(及其运行原理)
  9. ELK出现unassigned_shards查看及删除
  10. oracle java连接配置