当前位置: 首页 > news >正文

安卓开发中LiveData的使用

一、LiveData

LiveData 是 Android Jetpack 架构组件库中的一个关键组件,它被设计用来在应用的不同组件之间安全地共享数据。LiveData 是一种可观察的数据持有者类,它遵循观察者模式,允许组件订阅数据的变化,并在数据发生变化时得到通知。

以下是 LiveData 的一些主要特性和用法:

  1. 生命周期感知: LiveData 与观察者的生命周期紧密集成,确保数据只在观察者处于活跃状态时发送。这意味着,例如,当一个活动(Activity)不可见时,它不会接收到数据更新,从而避免不必要的工作和潜在的内存泄漏。
  2. 线程安全: LiveData 提供了线程安全的发布/订阅机制。你可以在后台线程中更新数据,而 LiveData 会确保这些更新在主线程(UI 线程)上被分发给观察者。
  3. 避免内存泄漏: 由于 LiveData 遵循观察者的生命周期,它可以帮助避免内存泄漏。如果观察者(如活动或片段)被销毁,它会自动取消对 LiveData 的订阅,因此 LiveData 不会尝试向已经不存在的组件发送更新。

使用方式:

定义 LiveData: 在 ViewModel 或其他类中定义 LiveData 实例。

 class MyViewModel : ViewModel() { val myData: MutableLiveData<String> = MutableLiveData() }

更新 LiveData: 更新 LiveData 的值,这会通知所有观察者。

myData.value = "New data"

观察 LiveData: 在活动的 onCreate 方法或片段的 onViewCreated 方法中观察 LiveData。 

viewModel.myData.observe(this, Observer { data -> // 更新 UI }
)

二、在项目中使用

1、在ViewMoel中定义

@HiltViewModel
class SwingFunPhotoVm @Inject constructor(private val restApi: BHeadRepository,application: Application
) : BaseViewModel(application) {private val templateListData = MutableLiveData<List<PhotoTemplateBean>?>()var mTemplateList : LiveData<List<PhotoTemplateBean>?> = templateListData......
}

定义两个 LiveData 实例(一个 MutableLiveData 和一个普通的 LiveData)为了在 ViewModel 和 UI 组件(如 Activity 或 Fragment)之间共享数据。有以下作用:

1、封装和数据安全:

  • MutableLiveData 允许你在 ViewModel 中更新数据。由于它是可变的,你可以在任何需要的时候设置或更新它的值。
  • 普通的 LiveData 则用于在 ViewModel 外部读取数据。由于它是不可变的,一旦初始化后就不能更改其引用,这有助于确保数据的封装和安全性。

2、观察数据变化:

在 UI 组件中,你可以观察 LiveData 的变化来更新 UI。当 MutableLiveData 中的数据发生变化时,所有观察 LiveData 的 UI 组件都会收到通知并进行更新。


3、遵循最佳实践:

将 MutableLiveData 作为私有成员变量保存在 ViewModel 中,这样可以避免直接从外部修改数据,而是通过公开的方法或回调来进行数据更新,这是一种更好的封装和设计实践。

4、数据传递:

mTemplateList 作为公开的 LiveData 属性,可以被外部组件(如 UI 组件)访问和观察。这样做可以确保 UI 组件总是在数据更新时得到通知。

5、避免内存泄漏:

通过使用 LiveData,你可以确保所有的观察者都是生命周期感知的,这意味着只有在观察者(如 Activity 或 Fragment)处于活跃状态时,它们才会接收到数据更新,从而避免内存泄漏。

2、在ViewModel中使用LiveData存储数据

@HiltViewModel
class SwingFunPhotoVm @Inject constructor(private val restApi: BHeadRepository,application: Application
) : BaseViewModel(application) {private val templateListData = MutableLiveData<List<PhotoTemplateBean>?>()var mTemplateList : LiveData<List<PhotoTemplateBean>?> = templateListData......fun getSwingFunTemplate(label: String,feature: String,consumer: Consumer<List<PhotoTemplateBean>>?) {processMain("getSwingFunTemplate") {restApi.getSwingFunTemplate(label, feature).doRest<List<PhotoTemplateBean>> {templateListData.value = it?: mutableListOf()AppLogTask.get().pushEventLog("<List<PhotoTemplateBean>>","$it")consumer?.accept(it)}.doError { error, _ ->failMag = error ?: ""}}}
}

执行网络请求后使用templateListData.value = it?: mutableListOf().value 方法更新livedata的值

3、在Fragment(Activity)中使用

    private fun initData(selectPhotos: SwingFunPhotoList) {vm.mTemplateList.observe(viewLifecycleOwner) { templateList ->templateList?.getOrNull(0)?.selected = truemRvAdapter.data = templateListtemplateList?.getOrNull(0)?.let { photoTemplateBean ->showLoading()vm.getHeadPhotoData(PutPhotoUrl(selectPhotos.user_url)) {headUrl = it ?: ""hideDialog()initEditView(photoTemplateBean, selectPhotos)}}}}

调用 vm.mTemplateList.observe(viewLifecycleOwner) 时是在设置一个观察者,用于观察 LiveData 中的数据变化。这里的 vmViewModel 的实例,而 mTemplateList 是在 ViewModel 中定义的 LiveData 实例。viewLifecycleOwner 是当前 FragmentActivity 的生命周期所有者。

LiveData 中的数据发生变化时就会调用{ }中的代码

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 算法41:位1的个数
  • 【人工智能学习笔记】4_1 深度学习基础之深度学习概述
  • 数据同步-Mysql同步到ElasticSearch
  • perl的学习记录——仿真regression
  • 【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn
  • Jeremy Howard对创业,AI产品,技术趋势,社区的看法
  • 万龙觉醒免费辅助:VMOS云手机辅助巴克尔阵容搭配攻略!
  • jQuery基础2-css的操作-事件-属性-Ajax-DOM操作
  • Redis访问工具
  • 【系统架构设计师】建造者模式(Builder Pattern)
  • 苹果手机铃声怎么设置自己的歌?3个方法自定义手机铃声
  • Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取相机当前数据吞吐量(Python)
  • MySQL里面的日期字符串如何转成日期做比较运算,获取两个日期之间的所有日期(包括起始日期)
  • 【计算机方向】中科院一区TOP!国人发文占比50%,录用比例容易,晋升宝刊!
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • angular组件开发
  • classpath对获取配置文件的影响
  • fetch 从初识到应用
  • interface和setter,getter
  • Otto开发初探——微服务依赖管理新利器
  • React Native移动开发实战-3-实现页面间的数据传递
  • react-native 安卓真机环境搭建
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • SpiderData 2019年2月13日 DApp数据排行榜
  • Terraform入门 - 1. 安装Terraform
  • TypeScript实现数据结构(一)栈,队列,链表
  • 编写符合Python风格的对象
  • 开源SQL-on-Hadoop系统一览
  • 七牛云假注销小指南
  • 如何用vue打造一个移动端音乐播放器
  • 在Unity中实现一个简单的消息管理器
  • 正则表达式
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • ​Spring Boot 分片上传文件
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • ###C语言程序设计-----C语言学习(3)#
  • #每日一题合集#牛客JZ23-JZ33
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (1)SpringCloud 整合Python
  • (10)STL算法之搜索(二) 二分查找
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (poj1.3.2)1791(构造法模拟)
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (七)glDrawArry绘制
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • (转)jdk与jre的区别
  • .net mvc部分视图
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET/C#⾯试题汇总系列:集合、异常、泛型、LINQ、委托、EF!(完整版)
  • .NET编程——利用C#调用海康机器人工业相机SDK实现回调取图与软触发取图【含免费源码】