Android LiveData 介绍

Android LiveData 介绍


系列文章目录

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更新数据

点击后

依赖

kotlin 复制代码
import androidx.lifecycle.LiveData

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

测试数据准备

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

布局文件:

kotlin 复制代码
<?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">

    <TextView
        android: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" />
    <Button
        android: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:

kotlin 复制代码
class MainActivity : AppCompatActivity() {


private lateinit var textView : TextView

    override 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类

kotlin 复制代码
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代码如下:

kotlin 复制代码
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView

class MainActivity : AppCompatActivity() {

private lateinit var viewModel : MainViewModel
private lateinit var textView : TextView

    override 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()

代码如下(示例):

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

3.更新它

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

viewmodel的代码更新为如下:

kotlin 复制代码
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 = 8

    private fun getNationalDay(day : Int): Int{
        nationalDay -= day
        return  nationalDay
    }



}

而activity代码最终如下:

kotlin 复制代码
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView

class MainActivity : AppCompatActivity() {

private lateinit var viewModel : MainViewModel
private lateinit var textView : TextView

    override 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的使用。

相关推荐
冬奇Lab9 分钟前
ANR实战分析:一次audioserver死锁引发的系统级故障排查
android·性能优化·debug
冬奇Lab15 分钟前
Android车机卡顿案例剖析:从Binder耗尽到单例缺失的深度排查
android·性能优化·debug
ZHANG13HAO1 小时前
调用脚本实现 App 自动升级(无需无感、允许进程中断)
android
圆号本昊2 小时前
【2025最新】Flutter 加载显示 Live2D 角色,实战与踩坑全链路分享
android·flutter
小曹要微笑2 小时前
MySQL的TRIM函数
android·数据库·mysql
mrsyf4 小时前
Android Studio Otter 2(2025.2.2版本)安装和Gradle配置
android·ide·android studio
DB虚空行者4 小时前
MySQL恢复之Binlog格式详解
android·数据库·mysql
liang_jy6 小时前
Android 事件分发机制(一)—— 全流程源码解析
android·面试·源码
峥嵘life7 小时前
2026 Android EDLA 认证相关资源网址汇总(持续更新)
android·java·学习
kkk_皮蛋7 小时前
在移动端使用 WebRTC (Android/iOS)
android·ios·webrtc