文章目录

  • Jetpack LiveData
    • 概述
    • LiveData优点
    • 基本使用
    • 活跃状态与非活跃状态
    • LiveData转换
      • Transformations#map()
      • Transformations#switchMap()
      • MediatorLiveData#addSource()
    • hasObservers()
    • observeForever()
    • 代码下载

Jetpack LiveData

概述

LiveData是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 activity、fragment 或 service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。

如果观察者(由 Observer 类表示)的生命周期处于 STARTEDRESUMED 状态,则 LiveData 会认为该观察者处于活跃状态。LiveData 只会将更新通知给活跃的观察者。为观察 LiveData 对象而注册的非活跃观察者不会收到更改通知。

您可以注册与实现 LifecycleOwner 接口的对象配对的观察者。有了这种关系,当相应的 Lifecycle 对象的状态变为 DESTROYED 时,便可移除此观察者。这对于 activity 和 fragment 特别有用,因为它们可以放心地观察 LiveData 对象,而不必担心泄露(当 activity 和 fragment 的生命周期被销毁时,系统会立即退订它们)。

LiveData优点

确保界面符合数据状态

LiveData 遵循观察者模式。当底层数据发生变化时,LiveData 会通知 Observer 对象。您可以整合代码以在这些 Observer 对象中更新界面。这样一来,您无需在每次应用数据发生变化时更新界面,因为观察者会替您完成更新。

不会发生内存泄漏

观察者会绑定到 Lifecycle 对象,并在其关联的生命周期遭到销毁后进行自我清理。

不会因 Activity 停止而导致崩溃

如果观察者的生命周期处于非活跃状态(如返回堆栈中的 activity),它便不会接收任何 LiveData 事件。

不再需要手动处理生命周期

界面组件只是观察相关数据,不会停止或恢复观察。LiveData 将自动管理所有这些操作,因为它在观察时可以感知相关的生命周期状态变化。

数据始终保持最新状态

如果生命周期变为非活跃状态,它会在再次变为活跃状态时接收最新的数据。例如,曾经在后台的 Activity 会在返回前台后立即接收最新的数据。

适当的配置更改

如果由于配置更改(如设备旋转)而重新创建了 activity 或 fragment,它会立即接收最新的可用数据。

共享资源

您可以使用单例模式扩展 LiveData 对象以封装系统服务,以便在应用中共享它们。LiveData 对象连接到系统服务一次,然后需要相应资源的任何观察者只需观察 LiveData 对象。

基本使用

创建LiveData对象

class SimpleViewModel : ViewModel() {//创建LiveData对象val liveData: MutableLiveData<String> by lazy {MutableLiveData<String>()}
}

创建观察者对象

val observer = object : Observer<String> {override fun onChanged(t: String?) {name.text = t}
}

观察LiveData对象

class LiveDataSimpleActivity : BaseActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_live_data_simple)//观察LiveData对象viewModel.liveData.observe(this, observer)}
}

发送消息

//UI线程发送消息
viewModel.liveData.setValue("hello world") //子线程发送消息
viewModel.liveData.postValue("hello world")

说明

  • LiveData对象调用observe()方法后,系统会立即调用onChanged()方法。

活跃状态与非活跃状态

观察者只有在活跃状态时,LiveData才会发送数据。

class LiveDataSimpleActivity : BaseActivity() {private val viewModel: SimpleViewModel by viewModels()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_live_data_simple)val name: TextView = findViewById(R.id.name)//创建观察者对象val observer = object : Observer<String> {override fun onChanged(t: String?) {Log.e(LIVEDATA, "onChanged: $t")name.text = t}}//观察LiveData对象viewModel.liveData.observe(this, observer)viewModel.liveData.setValue("onCreate") //非活跃状态,不会通知观察者}override fun onStart() {super.onStart()viewModel.liveData.setValue("onStart") //活跃状态,会通知观察者}override fun onResume() {super.onResume()viewModel.liveData.setValue("onResume") //活跃状态,会通知观察者}override fun onPause() {super.onPause()viewModel.liveData.setValue("onPause") //活跃状态,会通知观察者}override fun onStop() {super.onStop()viewModel.liveData.setValue("onStop") //非活跃状态,不会通知观察者}override fun onDestroy() {super.onDestroy()viewModel.liveData.setValue("onDestroy") //非活跃状态,不会通知观察者}
}

LiveData转换

Transformations#map()

修改LiveData发送的消息。

val userLiveData = MutableLiveData<User>()
val mapLiveData = Transformations.map(userLiveData, object : Function<User, String> {override fun apply(user: User): String {val userString = "id:${user.id} 姓名:${user.name} 年龄:${user.age} 地址:${user.address}"Log.e(LIVEDATA, userString)return userString}
})
mapLiveData.observe(this, object : Observer<String> {override fun onChanged(t: String?) {Log.e(LIVEDATA, "结果:$t")}
})
userLiveData.value = User(1, "小明", 19, "北京市")
apply: hello LiveData
onChanged: hello LiveData

Transformations#switchMap()

根据判断条件切换不同的LiveData。

val liveData1 = MutableLiveData<String>()
val liveData2 = MutableLiveData<String>()
val switchLiveData = MutableLiveData<Boolean>()
val resultLiveData = Transformations.switchMap(switchLiveData,object : Function<Boolean, LiveData<String>> {override fun apply(input: Boolean): LiveData<String> {if (input) {return liveData1} else {return liveData2}}})
resultLiveData.observe(this, object : Observer<String> {override fun onChanged(t: String?) {Log.e(LIVEDATA, "onChanged:$t")}
})
liveData1.value = "123"
liveData2.value = "ABC"
switchLiveData.value = false
onChanged:ABC

MediatorLiveData#addSource()

观察多个数据。

val mediatorLiveData = MediatorLiveData<String>()
val liveData1 = MutableLiveData<String>()
val liveData2 = MutableLiveData<String>()
mediatorLiveData.addSource(liveData1, object : Observer<String> {override fun onChanged(t: String?) {Log.e(LIVEDATA, "onChanged liveData1:$t")mediatorLiveData.value = t}
})
mediatorLiveData.addSource(liveData2, object : Observer<String> {override fun onChanged(t: String?) {Log.e(LIVEDATA, "onChanged liveData2:$t")mediatorLiveData.value = t}
})
mediatorLiveData.observe(this, object : Observer<String> {override fun onChanged(t: String?) {Log.e(LIVEDATA, "onChanged mediatorLiveData:$t")}
})
//        liveData1.value="123"
liveData2.value = "ABC"
onChanged liveData2:ABC
onChanged mediatorLiveData:ABC

hasObservers()

判断LiveData是否有观察者。

observeForever()

如果想让数据监测变化不受活动状态的影响,可以使用observeForever方法,这样Activity即使不处于活动状态,也可以接收到改变的数据,但当Activity销毁时,一定要主动调用removeObserver方法,否则LiveData会一直存在,这会导致内存泄漏。

代码下载

Jetpack LiveData相关推荐

  1. Jetpack——LiveData与ViewBinding

    这篇文章主要实现一下上篇文章中Jetpack-LiveData关于数据粘性的问题与ViewBinding两大部分. 一.LiveData去除数据粘性 上篇文章简单分析了 LiveData的使用和源码执 ...

  2. Android Jetpack LiveData 源码解析

    是什么 LiveData 是具备生命周期的数据,当数据放生变化的时候,如果页面已经销毁,那么就不会回调给监听者. 有什么用? 当我们获取到网络请求的数据,如果页面已经销毁了,就不会调用更新Ui 的方法 ...

  3. Android Jetpack - LiveData

    ◾︎简介 LiveData 是一种可观察的数据存储器类.与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity.Fragment 或 Service ...

  4. 面试:Jetpack相关

    一.LifeCycle原理 Lifecycle的生命周期状态事件和状态 Lifecycle是一个抽象类,其内部包括了添加和移除观察者的方法,还包括了此前说到的Event和State枚举.Lifecyc ...

  5. Android业务架构 · 基础篇 · Jetpack四件套

    一.序言 2017年,Google发布了Android Architecture Components,包括Room.LiveData.ViewModel和Paging等组件,旨在帮助开发者更轻松地实 ...

  6. Android JetPack系列---Lifecycle

    Android JetPack系列-Lifecycle jetpack也出来很长一段时间了,最近比较闲,然后顺便记录一下自己的学习.然后准备打算的是写一个一系列的文章来完成自己对jetpack 的了解 ...

  7. 基于 Android Architecture Components 的 MVVM 浅析

    0.前言 官方文档永远是最好的学习资料: Android Jectpack Android Jetpack: LiveData 和 Lifecycle 介绍 | 中文教学视频 Android Jetp ...

  8. 2022新鲜出炉Android面试总结附真题+答案解析(京东、新东方、货拉拉...)

    前言 从我的面试情况来看,不要以为技术面试过了就稳了,hr会卡人(京东),审批会卡人(货拉拉),所以,面试的时候,要多面试几家,不要一棵树吊死. 1.技术面试,通过 9家: 千喜鹤(2面),广州星域( ...

  9. Android 架构设计与挑选

    前言 谈到 Android 架构,相信谁都能说上两句.从 MVC,MVP,MVVM,再到时下兴起 MVI,架构设计层出不穷.如何为项目选择合适架构,也成常备课题. 由于架构并非空穴来风,每一种设计都有 ...

最新文章

  1. setBackgroundResource和setImageResource的区别
  2. filazilla搭建ftp_Windows7下利用FileZilla Server搭建ftp
  3. 【Python】青少年蓝桥杯_每日一题_5.03_判断是否是三角形
  4. 豆瓣9.8分,周志明的《凤凰架构》,高屋建瓴,推荐(送书)
  5. Oracle入门(十四.4)之在PL / SQL中使用变量
  6. python实现并发判重_寻找python大神!!!python如何多线程并发?
  7. Java List 的merge
  8. hdfs mv命令_Hadoop2.x HDFS shell命令
  9. css3ps—ps直接生成css3 使用方法
  10. 拼装机器人感想_机器人学习心得总结
  11. 五大常用算法实例列举
  12. 《算法竞赛入门经典》————竖式问题
  13. 架构一个可承受千万级访问量的动态扩展CMS
  14. 山东一卡通获省内首家第三方支付牌照
  15. IBM 2005-H16光钎交换机密码重置
  16. 【通識:人生哲學與幸福】老子人生觀巡禮
  17. linux kernel配置调试方法
  18. React:开发者工具谷歌插件下载安装
  19. oracle omf管理,Oracle OMF文件管理
  20. 基于深度卷积神经网络的人脸识别考勤系统-VGG-PYTHON-QT(1)

热门文章

  1. 【地平线旭日X3派试用体验】变身红白机玩转NES游戏
  2. uniapp 快速实现简单首页布局
  3. 求空间两条直线之间的距离
  4. 人脸识别服务器架构设计
  5. 多线程实现 qq 群聊的服务端和客户端
  6. 九九乘法表(99)详解
  7. python中检测键盘(上下左右) 代码
  8. 如何开启全新旅途,实现旅游市场活力复苏
  9. 悲伤时唱首歌:《暗恋桃花源》剧评
  10. 华为设备路由器直连路由器配置