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

Android LiveData 介绍

Android LiveData 介绍

  • 系列文章目录
  • 前言
  • 一、LiveData是什么?
  • 二、简单使用
    • 依赖
    • 测试数据准备
    • 1.创建可观察的livedata
    • 2.观察它
    • 3.更新它
  • 总结


系列文章目录

Android LiveData 介绍(本文)


前言

本系列根据官网介绍Jetpack中的数据通信组件,本文介绍LiveData。在介绍LiveData之前,我们需要知道安卓官方推荐我们在viewmodel中处理业务或者数据的一些运算和网络请求,并通过观察数据的变化,来通知activity或者fragment数据更新。

在这里插入图片描述


一、LiveData是什么?

我们先用官方的话来解释一下:

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

那么根据官网的总结,我们翻译成人话,就是Livedata是用于储存我们需要数据的一个类,那么为什么不直接new一个对象要多加一个LiveData呢?因为LiveData可以让使用到这个数据的组件的生命周期和这个数据同步, 以activity为例,当activity走到onDestroy时,数据也同样会被销毁,因此也避免了activity销毁了,activity持有的对象还活着而导致内存泄漏。 简单来说,Livedata就是为了解决这个问题而诞生的,它让开发者可以将更多的精力投入到具体的逻辑和功能中,而不是陷落在各个组件的生命周期的管理中。

二、简单使用

前面说到,LiveData 是一种可观察的数据存储器类,因此Livedata的使用可以简单的分为三步,及创建可观察的livedata,观察它,更新它

我们先看效果,然后实战

通过livedata更新数据
在这里插入图片描述
点击后
在这里插入图片描述

依赖

import androidx.lifecycle.LiveData

LiveData属于lifecycle,因此无需引入额外依赖,最新版的andorid studio 建项目就自带

测试数据准备

因为,国庆节写的这篇文章,所以本例就写一个过国庆的例子。

布局文件:

<?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"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/tv_national_day"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><Buttonandroid:id="@+id/bt_national_day"android:text="玩一天"android:layout_width="match_parent"android:layout_height="wrap_content"app:layout_constraintTop_toBottomOf="@+id/tv_national_day"/></androidx.constraintlayout.widget.ConstraintLayout>

MainActivity:


class MainActivity : AppCompatActivity() {private lateinit var textView : TextViewoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)initView()}private fun initView() {textView = findViewById(R.id.tv_national_day)val button = findViewById<Button>(R.id.bt_national_day)button.setOnClickListener {//todo 数据请求}}}

1.创建可观察的livedata

新建MainViewModel类

import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.MutableLiveData/*** @author zengyifeng* @date createDate:2023-09-30* @brief description ViewModel*/
class MainViewModel(application: Application) : AndroidViewModel(application) {var nationalDayLiveData : MutableLiveData<Int> = MutableLiveData(8)}

国庆节嘛,咱们要有点国庆味道,上例代码通过创建MutableLiveData 创建了一个名为nationalDayLiveData 的可观察对象。MutableLiveData 是基于LiveData的封装,暴露了setValue和postValue方法

在MainActivity中添加关于viewmodel的初始化,这时MainActivity代码如下:

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextViewclass MainActivity : AppCompatActivity() {private lateinit var viewModel : MainViewModel
private lateinit var textView : TextViewoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)initView()initViewModel()}private fun initView() {textView = findViewById(R.id.tv_national_day)val button = findViewById<Button>(R.id.bt_national_day)button.setOnClickListener {//todo 数据请求}}private fun initViewModel() {viewModel = MainViewModel(application)}}

2.观察它

在本例中,数据会在activity中更新,所以观察livedata对象也将进行在activity中,因此我们在MainActivity中新增观察livedata的代码initObserve()

代码如下(示例):

    private fun initObserve() {viewModel.nationalDayLiveData.observe(this) {textView.text = "国庆节还有$it 天"}}

3.更新它

因为app并不应该在activity中处理数据的具体逻辑,所以更新的方法在viewmodel中编写。

viewmodel的代码更新为如下:

import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.MutableLiveData/*** @author zengyifeng* @date createDate:2023-09-30* @brief description ViewModel*/
class MainViewModel(application: Application) : AndroidViewModel(application) {var nationalDayLiveData : MutableLiveData<Int> = MutableLiveData(8)fun setNationalDay(day : Int){val myDay = getNationalDay(day)nationalDayLiveData.postValue(myDay)}/*** 伪代码,实际业务中这里的返回应该是网络请求获取返回数据这样子*/private var nationalDay = 8private fun getNationalDay(day : Int): Int{nationalDay -= dayreturn  nationalDay}}

而activity代码最终如下:

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextViewclass MainActivity : AppCompatActivity() {private lateinit var viewModel : MainViewModel
private lateinit var textView : TextViewoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)initView()initViewModel()initObserve()}private fun initView() {textView = findViewById(R.id.tv_national_day)val button = findViewById<Button>(R.id.bt_national_day)button.setOnClickListener {viewModel.setNationalDay(1)}}private fun initViewModel() {viewModel = MainViewModel(application)viewModel.setNationalDay(0)}private fun initObserve() {viewModel.nationalDayLiveData.observe(this) {textView.text = "国庆节还有$it 天"}}
}

上例代码中,我们通过MutableLiveData 初始化了一个 nationalDayLiveData对象,然后通过observe观察nationalDayLiveData对象,最后通过postValue更新nationalDayLiveData对象,最后将数据更新在UI上。


总结

以上就是今天要讲的内容,本文简单介绍了LiveData是什么及其使用,通过创建观察更新六字口诀初步掌握LiveData的使用。

相关文章:

Android LiveData 介绍

Android LiveData 介绍 系列文章目录前言一、LiveData是什么&#xff1f;二、简单使用依赖测试数据准备1.创建可观察的livedata2.观察它3.更新它 总结 系列文章目录 Android LiveData 介绍&#xff08;本文&#xff09; 前言 本系列根据官网介绍Jetpack中的数据通信组件&…...

好看的货架效果(含3D效果)

搭配thymeleaf layui合成 货架一 1. css #gudinghuojia2F .layui-row { display: flex; justify-content: space-between; height: 100%;} #gudinghuojia2F .layui-col-xs10 {margin-right: 4%;} #gudinghuojia2F .layui-col-xs10:last-child {margin-right: 0;} .inner-ti…...

【每日一题】1498. 满足条件的子序列数目

1498. 满足条件的子序列数目 - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 nums 和一个整数 target 。 请你统计并返回 nums 中能满足其最小元素与最大元素的 和 小于或等于 target 的 非空 子序列的数目。 由于答案可能很大&#xff0c;请将结果对 109 7 取余后…...

Go语言数据类型实例讲解 - Go语言从入门到实战

Go语言数据类型实例讲解 - Go语言从入门到实战 基础数据类型 bool string int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr byte rune float32 float64 complex64 complex128类型描述bool布尔型&#xff08;bool&#xff09;&#xff1a;可以是true或f…...

RocketMQ 事务消息发送

目录 事务消息介绍 应用场景 功能原理 使用限制 使用示例 使用建议​ 事务消息介绍 在一些对数据一致性有强需求的场景&#xff0c;可以用 RocketMQ 事务消息来解决&#xff0c;从而保证上下游数据的一致性。 应用场景 分布式事务的诉求 分布式系统调用的特点为一个核…...

后端-POST请求中只需要两个参数,后端不想创建对象时

问题&#xff1a; 在前后端对接中&#xff0c;很多前端的规范是POST&#xff0c;参数放body里面&#xff0c;媒体类型是json&#xff0c;后端就需要用RequestBody去接收&#xff0c;但是后端只用接收两个对象&#xff0c;这时候后端不想创建对象&#xff0c;使用RequestParm&a…...

UG\NX二次开发 通过点云生成曲面 UF_MODL_create_surf_from_cloud

文章作者:里海 来源网站:《里海NX二次开发3000例专栏》 感谢粉丝订阅 感谢 Rlgun 订阅本专栏,非常感谢。 简介 有网友想做一个通过点云生成曲面的程序,我们也试一下 效果 代码 #include "me.hpp" /*HEAD CREATE_SURF_FROM_CLOUD CCC UFUN */...

Linux常用指令(二)

目录 一、 删除空目录&#xff08;rmdir&#xff09; 二、ln 硬链接与软链接 三、新建空文件或更新文件的时间戳&#xff08;touch&#xff09; 四、比较文件内容的差异&#xff08;diff&#xff09; 五、显示当前时间或设置系统时间&#xff08;date&#xff09; 六、显…...

【HUAWEI】单臂路由

目录 ​ &#x1f96e;写在前面 &#x1f96e;2.1、拓扑图 &#x1f96e;2.2、操作思路 &#x1f96e;2.3、配置操作 &#x1f363;2.3.1、LSW4配置 &#x1f363;2.3.2、R2配置 &#x1f363;2.3.3、测试网络 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &…...

安全学习_开发相关_Java第三方组件Log4jFastJSON及相关安全问题简介

文章目录 JNDI&#xff1a;(见图) Java-三方组件-Log4J&JNDILog4J&#xff1a;Log4j-组件安全复现使用Log4j Java-三方组件-FastJsonFastJson&#xff1a;Fastjson-组件安全复现对象转Json(带类型)Json转对象Fastjson漏洞复现&#xff08;大佬文章 JNDI&#xff1a;(见图) …...

零代码编程:用ChatGPT批量自动下载archive.org上的音频书

http://archive.org 是一个神奇的网站&#xff0c;可以下载各种古旧的软件、书籍、音频、视频&#xff0c;还可以搜索各个网站的历史网页。 比如说&#xff0c;一些儿童故事音频就可以在http://archive.org下载到&#xff0c;可以用来做英语听力启蒙用。 举个例子&#xff0c…...

力扣用队列实现栈

自己写的栈&#xff0c;再让其他函数去调用自己写的栈 typedef int QDataType; typedef struct QueueNode {struct QueueNode* next;//单链表QDataType data;//放数据 }QNode;typedef struct Queue {QNode* phead;//头节点QNode* ptail;//尾节点QDataType size; //统计有多少节…...

一朵华为云,如何做好百模千态?

点击关注 文丨刘雨琦、郝鑫 2005年华为提出网络时代的“All IP”&#xff0c;2011年提出数字化时代的“All Cloud”&#xff0c;2023年提出智能时代的“All Intelligence”。 截至目前&#xff0c;华为的战略升级经历了三个阶段。 步入智能化&#xff0c;需要迎接的困难依然…...

华为云云耀云服务器L实例评测 | 实例使用教学之软件安装:华为云云耀云服务器环境下安装 Docker

华为云云耀云服务器L实例评测 &#xff5c; 实例使用教学之软件安装&#xff1a;华为云云耀云服务器环境下安装 Docker 介绍华为云云耀云服务器 华为云云耀云服务器 &#xff08;目前已经全新升级为 华为云云耀云服务器L实例&#xff09; 华为云云耀云服务器是什么华为云云耀云…...

小程序编译器性能优化之路

作者 | 马可 导读 小程序编译器是百度开发者工具中的编译构建模块&#xff0c;用来将小程序代码转换成运行时代码。旧版编译器由于业务发展&#xff0c;存在编译慢、内存占用高的问题&#xff0c;我们对编译器做了一次大规模的重构&#xff0c;采用自研架构&#xff0c;做了多线…...

FFmpeg 命令:从入门到精通 | ffmpeg 命令分类查询

FFmpeg 命令&#xff1a;从入门到精通 | ffmpeg 命令分类查询 FFmpeg 命令&#xff1a;从入门到精通 | ffmpeg 命令分类查询ffmpeg -versionffmpeg -buildconfffmpeg -formatsffmpeg -muxersffmpeg -demuxersffmpeg -codecsffmpeg -decodersffmpeg -encodersffmpeg -bsfsffmpeg…...

Linux学习记录——삼십일 socket编程---TCP套接字

文章目录 TCP套接字简单通信1、服务端1、基本框架2、获取连接 2、客户端3、多进程4、多线程5、线程池6、简单的日志系统7、守护进程8、其它 TCP套接字简单通信 本篇gitee 学习完udp套接字通信后&#xff0c;再来看TCP套接字。 四个文件tcp_server.hpp&#xff0c; tcp_serve…...

【学习笔记】深度学习分布式系统

深度学习分布式系统 前言1. 数据并行&#xff1a;参数服务器2. 流水线并行&#xff1a;GPipe3. 张量并行&#xff1a;Megatron LM4. 切片并行&#xff1a;ZeRO5. 异步分布式&#xff1a;PATHWAYS总结参考链接 前言 最近跟着李沐老师的视频学习了深度学习分布式系统的发展。这里…...

【数据结构】树、二叉树的概念和二叉树的顺序结构及实现

目录 前言&#xff1a;一、树的概念及结构1.树的概念2.树的相关概念3.树的存储4.树在实际中的运用 二、二叉树概念及结构1.概念2.特殊的二叉树&#xff08;1&#xff09;满二叉树&#xff08;2&#xff09;完全二叉树 3.二叉树的性质4.二叉树的存储(1)顺序存储(2)链式存储 三、…...

rust学习-string

介绍 A UTF-8–encoded, growable string(可增长字符串). 拥有string内容的所有权 A String is made up of three components: a pointer to some bytes, a length, and a capacity. The length is the number of bytes currently stored in the buffer pub fn as_bytes(&…...

告别手动抢红包!用Kotlin写一个Android微信红包监听助手(附完整代码)

用Kotlin构建Android微信红包自动化工具&#xff1a;从原理到避坑指南 春节聚会时&#xff0c;你是否曾因低头抢红包错过亲友的精彩对话&#xff1f;工作群里的手气红包总在分神时一闪而过&#xff1f;作为一名Android开发者&#xff0c;其实可以用技术优雅解决这些烦恼。本文…...

CircuitPython displayio与触摸交互实战:复刻经典Neko猫咪动画

1. 项目概述与核心价值如果你玩过一些复古的掌机或者小型的嵌入式设备&#xff0c;可能会对屏幕上那只跟着你手指或光标跑的“Neko猫咪”有印象。这个源自上世纪经典屏保的小动画&#xff0c;在今天看来&#xff0c;依然是学习嵌入式图形和交互编程的绝佳入门项目。它麻雀虽小&…...

AI应用开发利器:NeuroAPI网关统一管理多模型调用与部署实战

1. 项目概述&#xff1a;一个面向AI应用开发的API网关最近在折腾AI应用开发的朋友&#xff0c;估计都绕不开一个头疼的问题&#xff1a;模型管理。今天想试试Claude&#xff0c;明天项目需要接入GPT-4&#xff0c;后天可能又要调用一个开源的Llama模型。每个模型都有自己的API地…...

使用 Taotoken 后模型 API 响应延迟与稳定性效果实测观察

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用 Taotoken 后模型 API 响应延迟与稳定性效果实测观察 作为一名需要频繁调用大模型 API 的开发者&#xff0c;模型服务的响应速…...

Vivado XADC IP核 配置与接口实战解析

1. XADC IP核基础入门 XADC&#xff08;Xilinx Analog-to-Digital Converter&#xff09;是Xilinx FPGA芯片内置的高精度模拟数字转换模块&#xff0c;它能实时监测芯片内部的电压、温度以及外部模拟信号。在Vivado开发环境中&#xff0c;我们可以通过XADC Wizard IP核快速配置…...

Yii2开启URI伪静态的相关配置

Yii2 开启URI伪静态的相关配置 Yii2支持url伪静态链接转换&#xff0c;在配置文件config/web.php中加入 # config/web.php $config [components > [// URI伪静态化配置urlManager > [enablePrettyUrl > true, // 启用美化 URL&#xff08;隐藏 index.php&#xff09;…...

c | 穿 |pld | 的 |女王 |2222

我通过百度网盘分享的文件&#xff1a;穿达的王2&#xff08;20... 链接&#xff1a;https://pan.baidu.com/s/1yiYXVmvY-KhDjwWzL2t81w?pwdj775 提取码&#xff1a;j775...

Electron鸿蒙PC上的系统托盘,坑比我想象的多三倍

Electron鸿蒙PC上的系统托盘&#xff0c;坑比我想象的多三倍 上个月我在做一个企业内部工具&#xff0c;需要在鸿蒙PC上实现系统托盘常驻和原生通知推送。本来以为这是个小功能&#xff0c;两三个小时搞定&#xff0c;结果愣是折腾了两天半。把过程记录下来&#xff0c;希望后…...

Win10 任务管理器点击“详细信息”崩溃 + U盘 PPTX 无法删除/复制(0x800700EA)问题排查

一、问题现象 最近遇到一个比较奇怪的问题&#xff1a; Win10 系统 任务管理器只能以“小窗口模式”打开 点击“详细信息”后直接崩溃 事件查看器报错&#xff1a; 错误应用程序名称: taskmgr.exe 版本: 10.0.19041.6280同时还伴随另一个问题&#xff1a; U盘中的 .pptx …...

UE5视频插件深度解析:如何实现高效的实时流媒体处理与录制

UE5视频插件深度解析&#xff1a;如何实现高效的实时流媒体处理与录制 【免费下载链接】InVideo 基于UE4实现的rtsp的视频播放插件 项目地址: https://gitcode.com/gh_mirrors/in/InVideo InVideo是一款基于Unreal Engine 5开发的专业级实时视频处理插件&#xff0c;专为…...