一点点入坑JetPack:LiveData篇

本文详细介绍了Jetpack中的LiveData,从入门的官方demo解析,到进阶的map()和switchMap()用法及源码分析,揭示了LiveData的生命周期感知特性及其在Android开发中的应用。通过MediatorLiveData的使用,展示了如何处理多个LiveData的状态变化。最后,探讨了Observer的响应机制和学习资源。
摘要由CSDN通过智能技术生成

一、入门

1.1、初级官方demo

class NameViewModel : ViewModel() {
    // 这里new了一个MutableLiveData,它是LiveData的实现类,LiveData是抽象的,很明显不能被new
    val currentName: LiveData<String> by lazy {
        MutableLiveData<String>()
    }
}

class NameActivity : AppCompatActivity() {
    private lateinit var mModel: NameViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mModel = ViewModelProviders.of(this).get(NameViewModel::class.java)
        // 这个this是LifecycleOwner
        mModel.currentName.observe(this, Observer { newName ->
            // mNameTextView一个TextView
            mNameTextView.text = newName
        })
        // 更新被观察者数据,LiveData会通知观察者
        mModel.currentName.postValue("MDove")
    }
}

如果看到这几行代码,豁然开朗,那么可以跳过看下面的部分。如果感觉有些疑惑,不着急咱们不打针不吃药,坐下就是和你唠…

1.2、demo解释

最开始我们先声明了一个NameViewModel的ViewModel,这部分内容在ViewModel篇有所提及。内部有一个MutableLiveData的成员变量。说白了就是一个LiveData类型的String,我们使用时是借助LiveData的特性,但本质还是用String。

也就是说这里如果我们要用一个List,那么此时就是MutableLiveData<List>()。

Activity之中,我们先获取ViewModel,然后mModel.currentName.observe(…,…),这里我们就是在观察LiveData。我们只需要在回调中处理我们自己的UI操作即可了。也就是demo中的mNameTextView.text = newName。

LiveData会在每一次postValue(…)或者value=…时,observe()便会回调,哪怕是null。

注意
这里有俩个点需要特别注意:

  • 1、LiveData是生命周期感知的,在当前的LifecycleOwner不处于活动状态(例如onPasue()、onStop())时,LiveData是不会回调observe()的,因为没有意义。
  • 2、如果LiveData没有被observe(),那么此时你调用这个LiveData的postValue(…)/value=…,是没有任何作用。这个我们可以在源码中看到。

1.3、不同的LiveData实现类(系统实现)

MutableLiveData:
上文咱们已经见过了,没什么特别的,就是LiveData的实现类。就相当于List和ArrayList的关系。
MediatorLiveData:
MutableLiveData的子类,它是一个比较强大的LiveData,我们的map()、switchMap()都是基于它进行实现的。
最大的特点是可以同时监听多个LiveData。

二、进阶

官网的这个小破demo,属实太寒酸了,你倒是加点特技啊?就这中初级用法,谁能觉得好用呢!所以,如果对LiveData稍稍有点感觉,那咱们不要停,一起决战到天明。

2.1、map()

初用过RxJava的小伙伴,估计会和我一样,被各种“姿势”的操作符所正经,比如常用的:map、flatMap…而LiveData中同样有这样的操作。
一个很常见的场景:我们通过一个唯一id去查询这个id下的实体类,并且要同时展示二者的数据。很简单的业务逻辑,在LiveData中的展示是这样的:

2.1.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值