在开发中使用ViewModel
的时候,肯定会想数据怎么回调到Activity/Fragment
会更好,Android SDK
给我们提供了LiveData
类来做数据回调的事情。这篇博客就来分享LiveData
相关的知识,希望对看文章的小伙伴有所帮助。
LiveData概述
LiveData
是一个可以被观察的数据容器类,我们可以将数据放到LiveData
中,让数据成为被观察者
,当数据发生变化的时候,默认会发起通知,这样界面就可以发生变化。使用LiveData
之后,我们的页面逻辑就变成了如下所示:
使用LiveData的好处
- 确保界面符合数据状态;
- 不会发生内存泄漏;
- 不会发生因为
Activity
停止而导致崩溃; - 不需要手动处理生命周期;
- 数据始终保持最新的状态;
- 不管重新创建
Activity/Fragment
,都会接受到最新的数据。
LiveData的使用
我们以开发一个计时器界面为例子,使用ViewModel
、LiveData
和Activity
为例子。
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则是完全是整个实体类或者数据类型变化后才通知,不会细节到某个字段。
网友评论