初探Jetpack(三) -- LiveData
LiveData 是 Jetpack 提供的一种响应式变成组件,它可以包含任何类型的数据,并在数据发现变化的时候,通知观察者。
LiveData 具有生命周期的感知能力,指它能感觉 activity,fragment ,service 的生命周期,且只有这些组件处于活跃生命周期状态时,LiveData 感觉到数据变化,才会发出通知。
什么意思呢?即如果 activity ,fragment 等观察者处于生命周期的 STARTED, ONRESUMED状态,则 LiveData 会认为该观察者处于活跃状态,LiveData 就会将最近的通知给活跃的观察者,而非活跃状态的观察者则收不到通知。
所以,当我们把 LiveData 和 有 LifecycleOwner 接口对象结合,当 Lifecycle 的对象状态为 DESTROYED 的时候,便可移除此观察者。 这对于 Activity 和 Fragment 特别有用,因为它们可以放心地观察 LiveData 对象而不必担心泄露(当 Activity 和 Fragment 的生命周期被销毁时,系统会立即退订它们)。
即我们不用手动去处理生命周期,它会自动管理这些操作。
一、基本使用
创建 LiveData 实例以存储某种类型的数据。这通常在 ViewModel 类中完成。
在第一张章,我们学习了 ViewModel 的计时器功能 初探Jetpack(一) – ViewModel,这里再使用 LiveData 对它进行扩展:
class DataViewModel() :ViewModel() {
private val _counter = MutableLiveData<Int>()
val counter : LiveData<Int> get() = _counter;
init {
_counter.value = 0;
}
fun plusOne(){
val size = _counter.value ?: 0;
_counter.value = size+1;
}
}
从上面看到,我们申明了一个 MutableLiveData 对象,并指定泛型为 Int,表示它的数据为整型。
MutableLiveData 是一种可变的 LiveData,有三个方法,分别是 getValue(),setValue()和 postValue()。
- getValue() : 用于获取 LiveData 的数据
- setValue() : 给 LiveData 设置数据,只能在主线程
- postValue(): 可以在非主线程中给LiveData 设置数据
// 这里用了 getValue 和 setValue 的语法糖
val size = _counter.value ?: 0;
_counter.value = size+1;
为了不让外面调用 MutableLiveData,把它设置成 private,且公布出去的 counter 是 MutableLiveData 的 get() 属性方法的返回值,这样 _counter 变量就对外面不可见了。
后面我们在activity 中,这样写:
val viewModel = ViewModelProvider(this).get(DataViewModel::class.java)
plusOne.setOnClickListener{
//点击增加
viewModel.plusOne()
}
//添加数据观察者
val textObserver = Observer<Int> { count ->
infoText.text = count.toString()
}
viewModel.counter.observe(this,textObserver)
注意看到,使用了 MutableLiveData 的observe方法,它接受两个参数,第一个参数为 LifecycleOwner,直接传递 this 即可,第二是是 observe 接口,当数据发生变化时,就会毁掉这里的接口。我们把数据更新到 textview 即可,效果如下:
第一行代码 第三版
官网 LifeData
上一篇: 监控CPU的小程序