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

相关推荐
千里马学框架2 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台2 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone2 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc2 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo2 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077002 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼2 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone2 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen2 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone2 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui