美文网首页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