Livedata 概览
LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力
如果观察者(由 Observer 类表示)的生命周期处于 STARTED 或 RESUMED 状态,则 LiveData 会认为该观察者处于活跃状态。。LiveData 只会将更新通知给活跃的观察者。为观察 LiveData 对象而注册的非活跃观察者不会收到更改通知。
您可以注册与实现 LifecycleOwner 接口的对象配对的观察者。有了这种关系,当相应的 Lifecycle 对象的状态变为 DESTROYED 时,便可移除此观察者。这对于 Activity 和 Fragment 特别有用,因为它们可以放心地观察 LiveData 对象,而不必担心泄露
LiveData 优势
- 数据符合页面状态
- 不会发生内存泄露
- 不会因 activity 停止而导致崩溃
- 不再需要手动处理生命周期
- 数据始终保持最新状态
- 可以用来做资源共享
Livedata 使用
一般来说我们会在 ViewModel 中创建 Livedata 对象,然后再 Activity/Fragment 的 onCreate 中注册 Livedata 监听(因为在 onStart 和 onResume 中进行监听可能会有冗余调用)
Livedata 简单使用
仍然还是用我们倒计时的例子,在 Viewmodel 中开始一个 2000s 的倒计时,然后通过 Livedata 回调给 Activity 进行更新界面,代码:
- viewmodel 代码
class CountDownModel : ViewModel() {
val countDownLivedata = MutableLiveData<String>()
private var remainSecond = 2000//剩余秒数
init {
val countDown = object : CountDownTimer(2000 * 1000, 1000) {
override fun onTick(millisUntilFinished: Long) {
remainSecond--
countDownLivedata.postValue("剩余:${remainSecond} 秒")
}
override fun onFinish() {
countDownLivedata.postValue("倒计时结束")
}
}
countDown.start()
}
}
复制代码
- activity 中观察数据更新 ui 代码
val countDownModel: CountDownModel by viewModels<CountDownModel> {
ViewModelProvider.NewInstanceFactory()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_count_down)
countDownModel.countDownLivedata.observe(this, object : Observer<String> {
override fun onChanged(value: String?) {
value?.let {
tv_countdown_remainsecond.text = it
}
}
})
}
复制代码
- 效果图