Android MVVM模式之LiveData详解与使用

一、介绍

     是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 activity、fragment 或 service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。

1.使用 LiveData 的优势

使用 LiveData 具有以下优势:

1.1、确保界面符合数据状态

LiveData 遵循观察者模式。当底层数据发生变化时,LiveData 会通知 Observer 对象。您可以整合代码以在这些 Observer 对象中更新界面。这样一来,您无需在每次应用数据发生变化时更新界面,因为观察者会替您完成更新。

1.2、不会发生内存泄漏

观察者会绑定到 Lifecycle 对象,并在其关联的生命周期遭到销毁后进行自我清理。

1.3、不会因 Activity 停止而导致崩溃

如果观察者的生命周期处于非活跃状态(如返回堆栈中的 activity),它便不会接收任何 LiveData 事件。

1.4、不再需要手动处理生命周期

界面组件只是观察相关数据,不会停止或恢复观察。LiveData 将自动管理所有这些操作,因为它在观察时可以感知相关的生命周期状态变化。

1.5、数据始终保持最新状态

如果生命周期变为非活跃状态,它会在再次变为活跃状态时接收最新的数据。例如,曾经在后台的 Activity 会在返回前台后立即接收最新的数据。

1.6、适当的配置更改

如果由于配置更改(如设备旋转)而重新创建了 activity 或 fragment,它会立即接收最新的可用数据。

1.6、共享资源

您可以使用单例模式扩展 LiveData 对象以封装系统服务,以便在应用中共享它们。LiveData 对象连接到系统服务一次,然后需要相应资源的任何观察者只需观察 LiveData 对象。如需了解详情,请参阅扩展 LiveData

二、创建 LiveData 对象

        LiveData 是一种可用于任何数据的封装容器,其中包括可实现 Collections 的对象,如 ListLiveData 对象通常存储在 ViewModel 对象中,并可通过 getter 方法进行访问

class MyViewModel : ViewModel() {


    private val currentName: MutableLiveData<String> by lazy {
        MutableLiveData<String>()
    }

    fun getCuttentLiveData(): MutableLiveData<String> {
        return currentName;
    }


}


class MyViewModelActivity:BaseActivity() {

    private var viewModel:MyViewModel?=null

    private lateinit var bind: MyLiveDataDemo
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        bind=DataBindingUtil.setContentView(this, R.layout.layout_livedata_demo)

         viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
        val  obsver=Observer<String>(){

            bind.textResult.setText(it)
        }

        viewModel?.getCuttentLiveData()?.observe(this,obsver)

        //更新 LiveData 对象
        bind.btnClickLivedata.setOnClickListener {
            viewModel?.getCuttentLiveData()?.value="我更新了"
        }
    }
}

2.1 更新 LiveData 对象

     bind.btnClickLivedata.setOnClickListener {
            viewModel?.getCuttentLiveData()?.value="我更新了"
        }
//或者
       bind.btnClickLivedata.setOnClickListener {
            viewModel?.getCuttentLiveData()?.postValue("我更新了")
        }

2.2 转换 LiveData

您可能希望在将 LiveData 对象分派给观察者之前对存储在其中的值进行更改,或者您可能需要根据另一个实例的值返回不同的 LiveData 实例。Lifecycle 软件包会提供 Transformations 类,该类包括可应对这些情况的辅助程序方法。

Transformations.map()

三、合并多个 LiveData 源

        MediatorLiveData 是 LiveData 的子类,允许您合并多个 LiveData 源。只要任何原始的 LiveData 源对象发生更改,就会触发 MediatorLiveData 对象的观察者。

class TestLiveDataActivity : BaseActivity() {

    lateinit var bind: MyLiveData
    var mutaData1: MutableLiveData<String>? = null
    var mutaData2: MutableLiveData<String>? = null
    var mediatorLiveData: MediatorLiveData<String>? = null
    var flag = false
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        bind = DataBindingUtil.setContentView(this, R.layout.layout_livedata)
        bind.btnLivedata.setOnClickListener {
            if (flag) {
                flag = false;
                mutaData1?.postValue("mutaData1我更新了")
            } else {
                flag = true;
                mutaData2?.value = "mutaData2我更新了"
            }


        }


        mutaData1 = MutableLiveData()
        mutaData2 = MutableLiveData()

        mediatorLiveData = MediatorLiveData()
        mediatorLiveData?.addSource(mutaData1!!, Observer<String> {
            mediatorLiveData?.value = it

        })

        mediatorLiveData?.addSource(mutaData2!!, Observer<String> {
            mediatorLiveData?.value = it

        })

        mediatorLiveData?.observe(this, Observer {
            bind.textUpdate.setText(it)
        })

    }


}

四、总结

        livedata的主要解决了解耦,以及防止内存泄露具有特别好的效果。在复杂的项目,可以很好的维护项目的稳定性。减少开发人员对未知的情况进行提早处理。也是MVVM模式的伴侣与必杀技。

猜你喜欢

转载自blog.csdn.net/qq36246172/article/details/128536277