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