美文网首页APP & program
Android-Jetpack-LiveData详解

Android-Jetpack-LiveData详解

作者: 阿博聊编程 | 来源:发表于2022-04-21 14:46 被阅读0次
配图来自网络,如侵必删

在开发中使用ViewModel的时候,肯定会想数据怎么回调到Activity/Fragment会更好,Android SDK给我们提供了LiveData类来做数据回调的事情。这篇博客就来分享LiveData相关的知识,希望对看文章的小伙伴有所帮助。

LiveData概述

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

配图来自网络,如侵必删

使用LiveData的好处

  • 确保界面符合数据状态;
  • 不会发生内存泄漏;
  • 不会发生因为Activity停止而导致崩溃;
  • 不需要手动处理生命周期;
  • 数据始终保持最新的状态;
  • 不管重新创建Activity/Fragment,都会接受到最新的数据。

LiveData的使用

我们以开发一个计时器界面为例子,使用ViewModelLiveDataActivity为例子。

1.在ViewModel使用LiveData

LiveData是抽象类,所有我们要使用LiveData的子类MutableLiveData,代码示例:

import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import 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.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.activity.viewModels
import androidx.lifecycle.MutableLiveData

class 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则是完全是整个实体类或者数据类型变化后才通知,不会细节到某个字段。

相关文章

网友评论

    本文标题:Android-Jetpack-LiveData详解

    本文链接:https://www.haomeiwen.com/subject/nswiertx.html