当前位置: 首页 > 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的使用。

http://www.lryc.cn/news/179152.html

相关文章:

  • 好看的货架效果(含3D效果)
  • 【每日一题】1498. 满足条件的子序列数目
  • Go语言数据类型实例讲解 - Go语言从入门到实战
  • RocketMQ 事务消息发送
  • 后端-POST请求中只需要两个参数,后端不想创建对象时
  • UG\NX二次开发 通过点云生成曲面 UF_MODL_create_surf_from_cloud
  • Linux常用指令(二)
  • 【HUAWEI】单臂路由
  • 安全学习_开发相关_Java第三方组件Log4jFastJSON及相关安全问题简介
  • 零代码编程:用ChatGPT批量自动下载archive.org上的音频书
  • 力扣用队列实现栈
  • 一朵华为云,如何做好百模千态?
  • 华为云云耀云服务器L实例评测 | 实例使用教学之软件安装:华为云云耀云服务器环境下安装 Docker
  • 小程序编译器性能优化之路
  • FFmpeg 命令:从入门到精通 | ffmpeg 命令分类查询
  • Linux学习记录——삼십일 socket编程---TCP套接字
  • 【学习笔记】深度学习分布式系统
  • 【数据结构】树、二叉树的概念和二叉树的顺序结构及实现
  • rust学习-string
  • No167.精选前端面试题,享受每天的挑战和学习
  • 【python】pycharm导入anaconda环境
  • 【数据结构】逻辑结构与物理结构
  • HTML5高级部分
  • 浏览器输入 URL 并回车发生了什么
  • asp.net core mvc 文件上传,下载,预览
  • Axios有哪些常用的方法?
  • PL/SQL+cpolar公网访问内网Oracle数据库
  • stable diffusion和gpt4-free快速运行
  • 分享三个国内可用的免费GPT-AI网站
  • 使用SDKMAN在Linux系统上安装JDK