JetPack LiveData(数据存储器类)笔记

官方文档地址:https://developer.android.google.cn/topic/libraries/architecture/livedata

学习这个组件我带着疑问来的:

1.以前我们的数据都实现序列化后进行传递和接收。

2.我在B页面修改的数据是不是有更加简单的方法来通知到A发生了变化呢。

组件给出的解释是:

1.是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力。

2.它的状态发生变更时,会通知到处于活跃的界面,而订阅中的非活跃界面则不会发生改变。

3.观察者可以在每次发生更改时更新界面,而不是在每次应用数据发生更改时更新界面。

使用 LiveData 的优势

https://developer.android.google.cn/topic/libraries/architecture/livedata#the_advantages_of_using_livedata

官方的原文:
使用 LiveData 具有以下优势:

确保界面符合数据状态
LiveData 遵循观察者模式。当生命周期状态发生变化时,LiveData 会通知 Observer 对象。您可以整合代码以在这些 Observer 对象中更新界面。观察者可以在每次发生更改时更新界面,而不是在每次应用数据发生更改时更新界面。
不会发生内存泄露
观察者会绑定到 Lifecycle 对象,并在其关联的生命周期遭到销毁后进行自我清理。
不会因 Activity 停止而导致崩溃
如果观察者的生命周期处于非活跃状态(如返回栈中的 Activity),则它不会接收任何 LiveData 事件。
不再需要手动处理生命周期
界面组件只是观察相关数据,不会停止或恢复观察。LiveData 将自动管理所有这些操作,因为它在观察时可以感知相关的生命周期状态变化。
数据始终保持最新状态
如果生命周期变为非活跃状态,它会在再次变为活跃状态时接收最新的数据。例如,曾经在后台的 Activity 会在返回前台后立即接收最新的数据。
适当的配置更改
如果由于配置更改(如设备旋转)而重新创建了 Activity 或 Fragment,它会立即接收最新的可用数据。
共享资源
您可以使用单一实例模式扩展 LiveData 对象以封装系统服务,以便在应用中共享它们。LiveData 对象连接到系统服务一次,然后需要相应资源的任何观察者只需观察 LiveData 对象。有关详情,请参阅扩展 LiveData。

引入库:

implementation "androidx.lifecycle:lifecycle-livedata-ktx:$rootProject.lifecycleVersion"

使用步骤:

1.LiveData一般依附在ViewModel下面使用

class LoginViewModel : ViewModel() {

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

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

在Activity/Fragment里加入观察

private lateinit var model: LoginViewModel

override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
//        model = ViewModelProviders.of(this).get(LoginViewModel::class.java)//2.0以上弃用
        model = ViewModelProvider(this)[LoginViewModel::class.java]
    }

然后进行观察订阅,在数据发生变化的时候界面即可感知和更新UI了,我想到的是就目前的MVP,我每次触发一个事件,如果在Presenter里面数据做出了变化,需要编写很多接口来回传,如果统一交由LiveData来管理,则把这个过程移到了界面订阅的方式来处理了。

override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        lifecycle.addObserver(CounterListener())

        model = ViewModelProvider(this)[LoginViewModel::class.java]

        reset.setOnClickListener {
            (it as TextView).text = "重置1"
            model.name.value = "重置名称"
            model.password.value = "11111"
        }

        val nameObserver = Observer<String> {
            account.text = it
        }

        val pwdObserver = Observer<String> {
            pwd.text = it
        }

        model.name.observe(viewLifecycleOwner, nameObserver)
        model.password.observe(viewLifecycleOwner, pwdObserver)
    }

另外数据在两个页面发生变化的响应问题,通过对这个需求的搜索得到要创建一个单例的LiveData来实现多界面更新。同时我加入了ViewModel来封装。

class SingleAccountLiveData : MutableLiveData<AccountInfo>() {

    companion object {

        private var instance: SingleAccountLiveData? = null

        fun getInstance(): SingleAccountLiveData {
            if (null == instance) {
                instance = SingleAccountLiveData()
            }
            return instance!!
        }
    }
}



class LoginViewModel : ViewModel() {

    val accountInfo: SingleAccountLiveData by lazy {
        SingleAccountLiveData.getInstance()
    }

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

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

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值