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

相关推荐
太空漫步112 小时前
android社畜模拟器
android
海绵宝宝_5 小时前
【HarmonyOS NEXT】获取正式应用签名证书的签名信息
android·前端·华为·harmonyos·鸿蒙·鸿蒙应用开发
凯文的内存7 小时前
android 定制mtp连接外设的设备名称
android·media·mtp·mtpserver
天若子7 小时前
Android今日头条的屏幕适配方案
android
林的快手8 小时前
伪类选择器
android·前端·css·chrome·ajax·html·json
望佑8 小时前
Tmp detached view should be removed from RecyclerView before it can be recycled
android
xvch11 小时前
Kotlin 2.1.0 入门教程(二十四)泛型、泛型约束、绝对非空类型、下划线运算符
android·kotlin
人民的石头14 小时前
Android系统开发 给system/app传包报错
android
yujunlong391915 小时前
android,flutter 混合开发,通信,传参
android·flutter·混合开发·enginegroup
rkmhr_sef15 小时前
万字详解 MySQL MGR 高可用集群搭建
android·mysql·adb