LiveData从入门到实战

2023-12-26 04:08
文章标签 实战 入门 livedata

本文主要是介绍LiveData从入门到实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、简介
1、什么是LiveData

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

2、LiveData 优势
  • 确保界面符合数据状态LiveData 遵循观察者模式。

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

  • 不会发生内存泄漏

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

  • 不会因 Activity 停止而导致崩溃

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

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

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

  • 数据始终保持最新状态

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

  • 适当的配置更改

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

  • 共享资源

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

二、代码实战
1、添加依赖
  • 项目build.gradle中
allprojects {repositories {google()jcenter()}
}
  • app模块下build.gradle中
def lifecycle_version = "2.2.0"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
2、创建LiveData对象
class UserViewModel : ViewModel() {val userBean = MutableLiveData<User>()fun requestUserData() {// 协程模拟耗时100msrunBlocking {delay(100)userBean.value = User("张三", 18)}}
}data class User(var name: String, var age: Int)
3、转换LiveData
  • 通过Transformations.map进行转换
  • map操作 对存储在 LiveData 对象中的值应用函数,并将结果传播到下游
        val mNameAll = MutableLiveData<String>()// 设置数据mNameAll.postValue("张三")val mTransformMap = Transformations.map(mNameAll) { nameAll ->"$nameAll, 李四"}mTransformMap.observe(this) {Log.d("tag", "mMapData $it")// D/tag: mMapData 张三, 李四}
  • 通过Transformations.switchMap进行装换
  • switchMap 将结果解封和分派到下游。传递给 switchMap() 的函数必须返回 LiveData 对象
        val mMapUser = MutableLiveData<User>()val mSwitchMapUser = MutableLiveData<User>()val mIsMap = MutableLiveData<Boolean>()val mSwitchMapData = Transformations.switchMap(mIsMap) { mIsMap ->if (mIsMap) {mMapUser.postValue(mUser.value)mMapUser} else {mSwitchMapUser}}mSwitchMapData.observe(this) {Log.d("tag", "mSwitchMapData ${it.name}   ${it.age}")// D/tag: mSwitchMapData 李四   24}// switchMapbtnSwitchMap.setOnClickListener {mSwitchMapUser.postValue(User("李四", 24))mIsMap.postValue(false)}
4、数据合并MediatorLiveData
    val mNameOne = MutableLiveData<String>()val mNameTwo = MutableLiveData<String>()val mediatorLiveData = MediatorLiveData<String>()// 依次给mNameOne和mNameTwo设置值mNameOne.postValue("张三")mNameTwo.postValue("李四")mediatorLiveData.addSource(mNameOne) {Log.d("tag", "mNameOne $it")//  D/tag: mNameOne 张三mediatorLiveData.value = it}mediatorLiveData.addSource(mNameTwo) {Log.d("tag", "mNameTwo $it")// D/tag: mNameTwo 李四mediatorLiveData.value = it}mediatorLiveData.observe(this) {Log.d("tag", "mediatorLiveData  is $it")}
  • 打印日志如下:
// D/tag: mNameOne 张三
// D/tag: mediatorLiveData  is 张三
// D/tag: mNameTwo 李四
// D/tag: mediatorLiveData  is 李四

通过日志可以看到,因为mNameOne和mNameTwo作为mediatorLiveData的source,
mediatorLiveData可以监听到两者的值

5、Activity中使用
class LiveDataDemoActivity : AppCompatActivity() {private lateinit var userViewModel: UserViewModeloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_live_data_demo)// initViewModeluserViewModel = ViewModelProviders.of(this).get(UserViewModel::class.java)initListener()initData()}private fun initListener() {getUserData.setOnClickListener {userViewModel.requestUserData()}// 修改数据btnChange.setOnClickListener {userViewModel.userBean.postValue(User(name = "李四", age = 24))}}private fun initData() {userViewModel.userBean.observe(this, Observer {tvUserInfo.text = "名字是:${it.name},年龄是:${it.age}"})}
}
6、布局文件
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/user"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="用户:"android:textColor="@android:color/black"android:textSize="16sp"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><TextViewandroid:id="@+id/tvUserInfo"android:layout_width="wrap_content"android:layout_height="20dp"android:text="小明"android:textColor="@android:color/black"android:textSize="16sp"app:layout_constraintStart_toEndOf="@+id/user"app:layout_constraintTop_toTopOf="parent" /><Buttonandroid:id="@+id/btnChange"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="20dp"android:text="修改用户数据"app:layout_constraintBottom_toTopOf="@+id/getUserData" /><Buttonandroid:id="@+id/getUserData"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="获取用户数据"app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
三、参考
  • https://developer.android.google.cn/topic/libraries/architecture/livedata?hl=zh_cn
  • https://www.itranslater.com/qa/details/2583127127965041664

这篇关于LiveData从入门到实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/538037

相关文章

Python与DeepSeek的深度融合实战

《Python与DeepSeek的深度融合实战》Python作为最受欢迎的编程语言之一,以其简洁易读的语法、丰富的库和广泛的应用场景,成为了无数开发者的首选,而DeepSeek,作为人工智能领域的新星... 目录一、python与DeepSeek的结合优势二、模型训练1. 数据准备2. 模型架构与参数设置3

Java实战之利用POI生成Excel图表

《Java实战之利用POI生成Excel图表》ApachePOI是Java生态中处理Office文档的核心工具,这篇文章主要为大家详细介绍了如何在Excel中创建折线图,柱状图,饼图等常见图表,需要的... 目录一、环境配置与依赖管理二、数据源准备与工作表构建三、图表生成核心步骤1. 折线图(Line Ch

Java使用Tesseract-OCR实战教程

《Java使用Tesseract-OCR实战教程》本文介绍了如何在Java中使用Tesseract-OCR进行文本提取,包括Tesseract-OCR的安装、中文训练库的配置、依赖库的引入以及具体的代... 目录Java使用Tesseract-OCRTesseract-OCR安装配置中文训练库引入依赖代码实

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程

《在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程》本文介绍了在Java中使用ModelMapper库简化Shapefile属性转JavaBean的过程,对比... 目录前言一、原始的处理办法1、使用Set方法来转换2、使用构造方法转换二、基于ModelMapper

Java实战之自助进行多张图片合成拼接

《Java实战之自助进行多张图片合成拼接》在当今数字化时代,图像处理技术在各个领域都发挥着至关重要的作用,本文为大家详细介绍了如何使用Java实现多张图片合成拼接,需要的可以了解下... 目录前言一、图片合成需求描述二、图片合成设计与实现1、编程语言2、基础数据准备3、图片合成流程4、图片合成实现三、总结前

nginx-rtmp-module构建流媒体直播服务器实战指南

《nginx-rtmp-module构建流媒体直播服务器实战指南》本文主要介绍了nginx-rtmp-module构建流媒体直播服务器实战指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. RTMP协议介绍与应用RTMP协议的原理RTMP协议的应用RTMP与现代流媒体技术的关系2

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1