Android-Jetpack-LiveData详解

藏宝库编辑 2024-9-12 00:20:44 75 0 来自 中国
在开发中使用ViewModel的时候,肯定会想数据怎么回调到Activity/Fragment会更好,Android SDK给我们提供了LiveData类来做数据回调的事故。这篇博客就来分享LiveData相干的知识,盼望对看文章的小搭档有所帮助。
LiveData概述

LiveData是一个可以被观察的数据容器类,我们可以将数据放到LiveData中,让数据成为被观察者,当数据发生厘革的时候,默认会发起关照,如许界面就可以发生厘革。使用LiveData之后,我们的页面逻辑就酿成了如下所示:

2.png
使用LiveData的利益


  • 确保界面符合数据状态;
  • 不会发生内存走漏;
  • 不会发生由于Activity制止而导致瓦解;
  • 不须要手动处理生命周期;
  • 数据始终保持最新的状态;
  • 不管重新创建Activity/Fragment,都会担当到最新的数据。
LiveData的使用

我们以开发一个计时器界面为例子,使用ViewModel、LiveData和Activity为例子。
1.在ViewModel使用LiveData

LiveData是抽象类,全部我们要使用LiveData的子类MutableLiveData,代码示例:
import androidx.lifecycle.MutableLiveDataimport androidx.lifecycle.ViewModelimport java.util.*class TimeViewModel : ViewModel() {    private var timer: Timer? = null    var currentTimeValue: Int = 0    private var currentTime: MutableLiveData<Int> = MutableLiveData()    fun getCurrentTime(): MutableLiveData<Int> {        return currentTime    }    /**     * 开始倒计时     */    fun startTimer() {        if (timer == null) {            timer = Timer()            val timerTask = object : TimerTask() {                override fun run() {                    currentTimeValue++                    currentTime.postValue(currentTimeValue)                }            }            timer?.schedule(timerTask, 1000, 1000)        }    }    override fun onCleared() {        super.onCleared()        timer?.cancel()    }}2.在Activity代码调用

import androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport android.widget.Buttonimport android.widget.TextViewimport androidx.activity.viewModelsimport androidx.lifecycle.MutableLiveDataclass TimeActivity : AppCompatActivity(R.layout.activity_time) {    private val mViewModel:TimeViewModel by viewModels()    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        val liveData:MutableLiveData<Int> = mViewModel.getCurrentTime()        // 通过LiveData.observe()观察ViewModel中的数据厘革        liveData.observe(this) {            // 收到数据改变的关照,更新界面。            findViewById<TextView>(R.id.timeTv).text = "当前记时:${it}s"        }        // 重置        findViewById<Button>(R.id.restartBtn).setOnClickListener {            liveData.value = 0            mViewModel.currentTimeValue = 0        }        // 计时开始        mViewModel.startTimer()    }}两个步调简朴素现一个计时器,感爱好的小搭档可以复制代码到编译器中实现一下。
LiveData与MutableLiveData区别


  • MutableLiveData的父类是LiveData;
  • LiveData在实体类里可以关照指定某个字段的数据更新;
  • MutableLiveData则是完全是整个实体类大概数据范例厘革后才关照,不会细节到某个字段。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 20:27, Processed in 0.165023 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表