• 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更新数据
    在这里插入图片描述
    点击后
    在这里插入图片描述

    依赖

    import androidx.lifecycle.LiveData
    
    • 1

    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">
    
        <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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    MainActivity:

    
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    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)
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    国庆节嘛,咱们要有点国庆味道,上例代码通过创建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.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)
          
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    2.观察它

    在本例中,数据会在activity中更新,所以观察livedata对象也将进行在activity中,因此我们在MainActivity中新增观察livedata的代码initObserve()

    代码如下(示例):

        private fun initObserve() {
            viewModel.nationalDayLiveData.observe(this) {
                textView.text = "国庆节还有$it 天"
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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 = 8
    
        private fun getNationalDay(day : Int): Int{
            nationalDay -= day
            return  nationalDay
        }
    
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    而activity代码最终如下:

    
    
    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 天"
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    上例代码中,我们通过MutableLiveData 初始化了一个 nationalDayLiveData对象,然后通过observe观察nationalDayLiveData对象,最后通过postValue更新nationalDayLiveData对象,最后将数据更新在UI上。


    总结

    以上就是今天要讲的内容,本文简单介绍了LiveData是什么及其使用,通过创建观察更新六字口诀初步掌握LiveData的使用。

  • 相关阅读:
    一个简单证件照的设计过程
    Unity进阶第二章-消息框架(实现角色吃金币功能)
    4、FFmpeg命令行操作7
    electron 应用开发优秀实践
    开发一个自己的Spring Boot Starter
    【元宇宙欧米说】We Are:Gif格式的NFT有何特色
    nodejs+vue菜谱美食食谱网站系统
    使用Opencv对图像进行压缩和解压缩
    KafKa3.x基础
    1 - Windows 10 - Python 类的常用高级系统函数(方法)通识
  • 原文地址:https://blog.csdn.net/shop_and_sleep/article/details/133439707