安卓开发中LiveData的使用

一、LiveData

LiveData 是 Android Jetpack 架构组件库中的一个关键组件,它被设计用来在应用的不同组件之间安全地共享数据。LiveData 是一种可观察的数据持有者类,它遵循观察者模式,允许组件订阅数据的变化,并在数据发生变化时得到通知。

以下是 LiveData 的一些主要特性和用法:

  1. 生命周期感知: LiveData 与观察者的生命周期紧密集成,确保数据只在观察者处于活跃状态时发送。这意味着,例如,当一个活动(Activity)不可见时,它不会接收到数据更新,从而避免不必要的工作和潜在的内存泄漏。
  2. 线程安全: LiveData 提供了线程安全的发布/订阅机制。你可以在后台线程中更新数据,而 LiveData 会确保这些更新在主线程(UI 线程)上被分发给观察者。
  3. 避免内存泄漏: 由于 LiveData 遵循观察者的生命周期,它可以帮助避免内存泄漏。如果观察者(如活动或片段)被销毁,它会自动取消对 LiveData 的订阅,因此 LiveData 不会尝试向已经不存在的组件发送更新。

使用方式:

定义 LiveData: 在 ViewModel 或其他类中定义 LiveData 实例。

 class MyViewModel : ViewModel() { val myData: MutableLiveData<String> = MutableLiveData() }

更新 LiveData: 更新 LiveData 的值,这会通知所有观察者。

myData.value = "New data"

观察 LiveData: 在活动的 onCreate 方法或片段的 onViewCreated 方法中观察 LiveData。 

viewModel.myData.observe(this, Observer { data -> 
            // 更新 UI }
)

二、在项目中使用

1、在ViewMoel中定义

@HiltViewModel
class SwingFunPhotoVm @Inject constructor(
    private val restApi: BHeadRepository,
    application: Application
) : BaseViewModel(application) {

    private val templateListData = MutableLiveData<List<PhotoTemplateBean>?>()
    var mTemplateList : LiveData<List<PhotoTemplateBean>?> = templateListData
   
    ...
    ...
}

定义两个 LiveData 实例(一个 MutableLiveData 和一个普通的 LiveData)为了在 ViewModel 和 UI 组件(如 Activity 或 Fragment)之间共享数据。有以下作用:

1、封装和数据安全:

  • MutableLiveData 允许你在 ViewModel 中更新数据。由于它是可变的,你可以在任何需要的时候设置或更新它的值。
  • 普通的 LiveData 则用于在 ViewModel 外部读取数据。由于它是不可变的,一旦初始化后就不能更改其引用,这有助于确保数据的封装和安全性。

2、观察数据变化:

在 UI 组件中,你可以观察 LiveData 的变化来更新 UI。当 MutableLiveData 中的数据发生变化时,所有观察 LiveData 的 UI 组件都会收到通知并进行更新。


3、遵循最佳实践:

将 MutableLiveData 作为私有成员变量保存在 ViewModel 中,这样可以避免直接从外部修改数据,而是通过公开的方法或回调来进行数据更新,这是一种更好的封装和设计实践。

4、数据传递:

mTemplateList 作为公开的 LiveData 属性,可以被外部组件(如 UI 组件)访问和观察。这样做可以确保 UI 组件总是在数据更新时得到通知。

5、避免内存泄漏:

通过使用 LiveData,你可以确保所有的观察者都是生命周期感知的,这意味着只有在观察者(如 Activity 或 Fragment)处于活跃状态时,它们才会接收到数据更新,从而避免内存泄漏。

2、在ViewModel中使用LiveData存储数据

@HiltViewModel
class SwingFunPhotoVm @Inject constructor(
    private val restApi: BHeadRepository,
    application: Application
) : BaseViewModel(application) {

    private val templateListData = MutableLiveData<List<PhotoTemplateBean>?>()
    var mTemplateList : LiveData<List<PhotoTemplateBean>?> = templateListData

   
    ...
    ...


    fun getSwingFunTemplate(
        label: String,
        feature: String,
        consumer: Consumer<List<PhotoTemplateBean>>?
    ) {
        processMain("getSwingFunTemplate") {
            restApi.getSwingFunTemplate(label, feature)
                .doRest<List<PhotoTemplateBean>> {
                    templateListData.value = it?: mutableListOf()
                    AppLogTask.get().pushEventLog(
                        "<List<PhotoTemplateBean>>",
                        "$it"
                    )
                    consumer?.accept(it)
                }
                .doError { error, _ ->
                    failMag = error ?: ""
                }

        }
    }
}

执行网络请求后使用templateListData.value = it?: mutableListOf().value 方法更新livedata的值

3、在Fragment(Activity)中使用

    private fun initData(selectPhotos: SwingFunPhotoList) {
        vm.mTemplateList.observe(viewLifecycleOwner) { templateList ->
            templateList?.getOrNull(0)?.selected = true
            mRvAdapter.data = templateList
            templateList?.getOrNull(0)?.let { photoTemplateBean ->
                showLoading()
                vm.getHeadPhotoData(PutPhotoUrl(selectPhotos.user_url)) {
                    headUrl = it ?: ""
                    hideDialog()
                    initEditView(photoTemplateBean, selectPhotos)
                }
            }
        }
    }

调用 vm.mTemplateList.observe(viewLifecycleOwner) 时是在设置一个观察者,用于观察 LiveData 中的数据变化。这里的 vmViewModel 的实例,而 mTemplateList 是在 ViewModel 中定义的 LiveData 实例。viewLifecycleOwner 是当前 FragmentActivity 的生命周期所有者。

LiveData 中的数据发生变化时就会调用{ }中的代码

Kotlin LiveData 是用于 Android 开发的一个特性,它是一个发布-订阅模式的数据源。LiveData 允许你创建可以被观察(即订阅)的数据对象,从而让你的组件知道数据何时发生变化。这使得数据更新更加透明,并且可以轻松地将数据传递给依赖它的组件。 使用 Kotlin LiveData 的基本步骤如下: 1. 创建一个 LiveData 对象:LiveData 对象是你想要发布的数据的公共视图。你可以将任何可变的、可观察的数据(如变量、属性或对象)封装在 LiveData 对象。 ```kotlin val liveData = MutableLiveData<Int>() ``` 2. 将数据设置为 LiveData 对象:你可以通过调用 LiveData 对象的 set 方法将数据发布出去。 ```kotlin liveData.value = 42 ``` 3. 将 LiveData 对象传递给依赖它的组件:你可以将 LiveData 对象传递给任何需要它的组件,如 ViewModel 或 Activity/Fragment。这样,当 LiveData 的数据发生变化时,所有订阅该数据的组件都会收到通知。 4. 使用观察者更新 UI:一旦你订阅了 LiveData 对象,你就可以在 UI 使用观察者来更新 UI。当数据发生变化时,UI 将自动更新。 LiveData 的优点包括: * 它提供了一种简单的方法来处理数据更新,使得组件之间的通信更加清晰和一致。 * 它允许你将数据传递给任何需要它的组件,而无需手动复制或传递数据。 * 它支持多线程操作,可以在异步操作安全地更新 LiveData 对象。 需要注意的是,LiveData 是用于在后台线程维护数据的,并且不能被外部观察者修改。因此,如果你需要修改数据并通知外部观察者,你可能需要使用其他方法,如使用 ViewModel 或其他观察者模式实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值