可做商業(yè)用途的圖片網(wǎng)站新開(kāi)網(wǎng)店自己如何推廣
Android LiveData 介紹
- 系列文章目錄
- 前言
- 一、LiveData是什么?
- 二、簡(jiǎn)單使用
- 依賴(lài)
- 測(cè)試數(shù)據(jù)準(zhǔn)備
- 1.創(chuàng)建可觀察的livedata
- 2.觀察它
- 3.更新它
- 總結(jié)
系列文章目錄
Android LiveData 介紹(本文)
前言
本系列根據(jù)官網(wǎng)介紹Jetpack中的數(shù)據(jù)通信組件,本文介紹LiveData。在介紹LiveData之前,我們需要知道安卓官方推薦我們?cè)趘iewmodel中處理業(yè)務(wù)或者數(shù)據(jù)的一些運(yùn)算和網(wǎng)絡(luò)請(qǐng)求,并通過(guò)觀察數(shù)據(jù)的變化,來(lái)通知activity或者fragment數(shù)據(jù)更新。
一、LiveData是什么?
我們先用官方的話來(lái)解釋一下:
LiveData 是一種可觀察的數(shù)據(jù)存儲(chǔ)器類(lèi)。與常規(guī)的可觀察類(lèi)不同,LiveData 具有生命周期感知能力,意指它遵循其他應(yīng)用組件(如 activity、fragment 或 service)的生命周期。這種感知能力可確保 LiveData 僅更新處于活躍生命周期狀態(tài)的應(yīng)用組件觀察者。
那么根據(jù)官網(wǎng)的總結(jié),我們翻譯成人話,就是Livedata是用于儲(chǔ)存我們需要數(shù)據(jù)的一個(gè)類(lèi),那么為什么不直接new一個(gè)對(duì)象要多加一個(gè)LiveData呢?因?yàn)長(zhǎng)iveData可以讓使用到這個(gè)數(shù)據(jù)的組件的生命周期和這個(gè)數(shù)據(jù)同步, 以activity為例,當(dāng)activity走到onDestroy時(shí),數(shù)據(jù)也同樣會(huì)被銷(xiāo)毀,因此也避免了activity銷(xiāo)毀了,activity持有的對(duì)象還活著而導(dǎo)致內(nèi)存泄漏。 簡(jiǎn)單來(lái)說(shuō),Livedata就是為了解決這個(gè)問(wèn)題而誕生的,它讓開(kāi)發(fā)者可以將更多的精力投入到具體的邏輯和功能中,而不是陷落在各個(gè)組件的生命周期的管理中。
二、簡(jiǎn)單使用
前面說(shuō)到,LiveData 是一種可觀察的數(shù)據(jù)存儲(chǔ)器類(lèi),因此Livedata的使用可以簡(jiǎn)單的分為三步,及創(chuàng)建可觀察的livedata,觀察它,更新它
我們先看效果,然后實(shí)戰(zhàn)
通過(guò)livedata更新數(shù)據(jù)
點(diǎn)擊后
依賴(lài)
import androidx.lifecycle.LiveData
LiveData屬于lifecycle,因此無(wú)需引入額外依賴(lài),最新版的andorid studio 建項(xiàng)目就自帶
測(cè)試數(shù)據(jù)準(zhǔn)備
因?yàn)?#xff0c;國(guó)慶節(jié)寫(xiě)的這篇文章,所以本例就寫(xiě)一個(gè)過(guò)國(guó)慶的例子。
布局文件:
<?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"><TextViewandroid: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" /><Buttonandroid: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:
class MainActivity : AppCompatActivity() {private lateinit var textView : TextViewoverride 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 數(shù)據(jù)請(qǐng)求}}}
1.創(chuàng)建可觀察的livedata
新建MainViewModel類(lèi)
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)}
國(guó)慶節(jié)嘛,咱們要有點(diǎn)國(guó)慶味道,上例代碼通過(guò)創(chuàng)建MutableLiveData 創(chuàng)建了一個(gè)名為nationalDayLiveData 的可觀察對(duì)象。MutableLiveData 是基于LiveData的封裝,暴露了setValue和postValue方法
在MainActivity中添加關(guān)于viewmodel的初始化,這時(shí)MainActivity代碼如下:
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextViewclass MainActivity : AppCompatActivity() {private lateinit var viewModel : MainViewModel
private lateinit var textView : TextViewoverride 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 數(shù)據(jù)請(qǐng)求}}private fun initViewModel() {viewModel = MainViewModel(application)}}
2.觀察它
在本例中,數(shù)據(jù)會(huì)在activity中更新,所以觀察livedata對(duì)象也將進(jìn)行在activity中,因此我們?cè)贛ainActivity中新增觀察livedata的代碼initObserve():
代碼如下(示例):
private fun initObserve() {viewModel.nationalDayLiveData.observe(this) {textView.text = "國(guó)慶節(jié)還有$it 天"}}
3.更新它
因?yàn)閍pp并不應(yīng)該在activity中處理數(shù)據(jù)的具體邏輯,所以更新的方法在viewmodel中編寫(xiě)。
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)}/*** 偽代碼,實(shí)際業(yè)務(wù)中這里的返回應(yīng)該是網(wǎng)絡(luò)請(qǐng)求獲取返回?cái)?shù)據(jù)這樣子*/private var nationalDay = 8private fun getNationalDay(day : Int): Int{nationalDay -= dayreturn nationalDay}}
而activity代碼最終如下:
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextViewclass MainActivity : AppCompatActivity() {private lateinit var viewModel : MainViewModel
private lateinit var textView : TextViewoverride 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 = "國(guó)慶節(jié)還有$it 天"}}
}
上例代碼中,我們通過(guò)MutableLiveData 初始化了一個(gè) nationalDayLiveData對(duì)象,然后通過(guò)observe觀察nationalDayLiveData對(duì)象,最后通過(guò)postValue更新nationalDayLiveData對(duì)象,最后將數(shù)據(jù)更新在UI上。
總結(jié)
以上就是今天要講的內(nèi)容,本文簡(jiǎn)單介紹了LiveData是什么及其使用,通過(guò)創(chuàng)建觀察更新六字口訣初步掌握LiveData的使用。