MVVM学习之LivaData

1,162 阅读2分钟

1. 概念理解

简介:LiveData 是一个有生命周期感知 + 可观察的数据持有者类

作用:持久化的观察数据的更改与变化

特点

  • 感知对应Activity的生命周期,只有生命周期处于onStart与onResume时,LiveData处于活动状态,才会把更新的数据通知至对应的Activity
  • 当生命周期处于onStop或者onPause时,不回调数据更新,直至生命周期为onResume时,立即回调
  • 当生命周期处于onDestory时,观察者会自动删除,防止内存溢出
  • 共享资源。可以使用单例模式扩展LiveData对象以包装系统服务,以便可以在应用程序中共享它们,同时有遵守了以上生命周期

2. LiveData简单使用示例

先放一个XML文件,里面就2个TextView,用来做效果演示

首先声明,LiveData一般在Activity生命周期处于onStop或者onPause时,不回调数据更新,直至生命周期为onResume时,立即回调

Activity生命周期忘了?没关系,上图!

  • onResume:resume表示继续、重新开始。
  • onPause:pause表示暂停,当Activity要跳到另一个Activity或应用正常退出时都会执行这个方法。
  • onStop:stop表示停止,此时Activity已经不可见了,但是Activity对象还在内存中,没有被销毁。

Activity生命周期

<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable
            name="onlyLive"
            type="String" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_horizontal"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="30dp"
            android:orientation="horizontal">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="单独使用LiveData设置数据@" />

            <TextView
                android:id="@+id/txt_only_live"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{onlyLive}" />

        </LinearLayout>

    </LinearLayout>
</layout>

Activity代码

class LiveDataActivity : AppCompatActivity() {

    private lateinit var binding: ActivityLivedataBinding
    private val liveData = MutableLiveData<String>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_livedata)

        binding = DataBindingUtil.setContentView(this, R.layout.activity_livedata)
        binding.onlyLive = liveData.value

        //数据改变监听
        //数据改变监听
        liveData.observe(this, Observer<String?> {
            binding.onlyLive = it
            Log.d("观察LiveData", "单独使用LiveData ==> $it")
        })

    }

    override fun onStop() {
        super.onStop()
        liveData.postValue("单独LiveData使用")
    }
}

Demo展示

首先进入APP -> Back to home -> 再次进入APP

也就是重新开始onResume,回调数据则文本更新,周期调用如图

周期调用

Demo展示

LiveData与DataBinding双向绑定以及配合ViewModel使用

目前使用LiveData需要监听才能使用,但是DataBinding也可以进行数据绑定且比LiveData更加方便,为啥还要LiveData呢?以下做一个演示建一个测试类,用到我们的ObservableField

class TestBean {
    val name = ObservableField<String>()
    private fun setName(name: String) {
        this.name.set(name)
    }
}
class LiveDataViewModel : ViewModel() {
    private val nameLiveData = MutableLiveData<String>()
    fun getData(): MutableLiveData<String> {
        return nameLiveData
    }
}
  • Activity代码和XML代码在文末链接的Demo里

MVVM-LiveData-ViewModel

  • 发现DataBinding双向绑定也跟随生命周期了。LiveData配合ViewModel使用,不用监听也能绑定数据。