欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

初探Jetpack(三) -- LiveData

程序员文章站 2022-06-08 15:54:10
...

初探Jetpack(一) – ViewModel
初探Jetpack(二) – Lifecycles

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 即可,效果如下:
初探Jetpack(三) -- LiveData

第一行代码 第三版
官网 LifeData

相关标签: LiveData