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

相关推荐
帅得不敢出门10 小时前
安卓设备adb执行AT指令控制电话卡
android·adb·sim卡·at指令·电话卡
我又来搬代码了11 小时前
【Android】使用productFlavors构建多个变体
android
德育处主任13 小时前
Mac和安卓手机互传文件(ADB)
android·macos
芦半山13 小时前
Android“引用们”的底层原理
android·java
迃-幵14 小时前
力扣:225 用队列实现栈
android·javascript·leetcode
大风起兮云飞扬丶14 小时前
Android——从相机/相册获取图片
android
Rverdoser14 小时前
Android Studio 多工程公用module引用
android·ide·android studio
aaajj15 小时前
[Android]从FLAG_SECURE禁止截屏看surface
android
@OuYang15 小时前
android10 蓝牙(二)配对源码解析
android
Liknana15 小时前
Android 网易游戏面经
android·面试