一、导入
其官方扩展为:
def lifecycle_version = "2.2.0"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
二、简单的使用和介绍
1、简单介绍
看到 MediatorLiveData 这个类,根据名字我们就可以知道这个类肯定是利用了 中介者模式,那么我们也可以想想看这个类会如何使用呢?
答:MediatorLiveData 可以接管普通的 LiveData,使得当 LiveData 有数据更新的时候,MediatorLiveData 也能够 “收到响应”。
2、例子
/**
* 某 Activity中
*/
private val originData = MutableLiveData<String>()
private val mediatorLiveData = MediatorLiveData<String>()
override fun onCreate(savedInstanceState: Bundle?) {
... ...
mediatorLiveData.addSource(originData, Observer<String>{
Log.e("==>liveData","addSourceObserver:$it")
})
btn.setOnClickListener {
originData.value = "Hello"
}
}
创建一个 MediatorLiveData 对象,然后通过 mediatorLiveData.addSource()
这个方法,将需要接管 MutableLiveData 类型的 originData
对象传入,然后在添加回调方法,当我们点击按钮的时候,设置 originData
的值,最后控制台输出:
==>liveData: addSourceObserver:Hello
然而,控制台并没有这么输出……
不要怀疑人生,通过研究源码我们可以得知:为什么 addSource()
方法里的回调没有被调用?
那是因为 MediatorLiveData 对象没有被 “激活”,而被“激活”的条件就是调用 MediatorLiveData 的 observe()
或者 observeForever()
方法。所以我们再试一次:
override fun onCreate(savedInstanceState: Bundle?) {
... ...
mediatorLiveData.observe(this, Observer {
Log.e("==>liveData","mediatorLiveData:$it")
})
... ...
}
然后点击按钮再次查看控制台输出:
你以为的输出:
==>liveData: addSourceObserver:Hello
==>liveData: mediatorLiveData:Hello
实际上的输出:
==>liveData: addSourceObserver:Hello
3、为什么会这样(源码分析)
三、应用场景
1. API级别的应用场景(主要的)
Transformations,这个类是一个工具类,只有 3 个静态方法分别是:
map()
switchMap()
distinctUntilChanged()
这三个方法都是和 MediatorLiveData 相关,并且这三个方法都 很重要 !
看链接:LiveData扩展之Transformations
2. 其他应用场景
假设我们需要获取数据,然后将数据的内容展示到UI上,我们有两种方式获取数据,第一种就是拿本地的数据,第二种就是拿网络的数据。我们可以定义两个 MutableLiveData ,对应两种不同方式获取的数据,因为是同一种数据类型,所以我们可以通过 MediatorLiveData 使用 addSource()
来接管两个 MutableLiveData ,并且传入同一个 Observer,这样我们就只需要在 Observer 中进行操作即可……(细思其实并没什么卵用)
四、小结
其实对于 MediatorLiveData 我们仅需要了解,并且熟悉其源码即可……在实际的开发中,我们使用更多的是 Transformations。
只不过在学习 Transformations 之前,MediatorLiveData 是必须要了解的东西。