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