Jetpack篇——LiveData扩展之MediatorLiveData

一、导入

其官方扩展为:

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 对象没有被 “激活”,而被“激活”的条件就是调用 MediatorLiveDataobserve() 或者 observeForever() 方法。所以我们再试一次:

	override fun onCreate(savedInstanceState: Bundle?) {
    
    
        ... ...
        mediatorLiveData.observe(this, Observer {
    
    
            Log.e("==>liveData","mediatorLiveData:$it")
        })
        ... ...
    }

然后点击按钮再次查看控制台输出:

你以为的输出:
==>liveData: addSourceObserver:Hello
==>liveData: mediatorLiveData:Hello

实际上的输出:
==>liveData: addSourceObserver:Hello

what

3、为什么会这样(源码分析)

MediatorLiveData源码分析

三、应用场景

1. API级别的应用场景(主要的)

Transformations,这个类是一个工具类,只有 3 个静态方法分别是:

  1. map()
  2. switchMap()
  3. distinctUntilChanged()

这三个方法都是和 MediatorLiveData 相关,并且这三个方法都 很重要

看链接:LiveData扩展之Transformations

2. 其他应用场景

假设我们需要获取数据,然后将数据的内容展示到UI上,我们有两种方式获取数据,第一种就是拿本地的数据,第二种就是拿网络的数据。我们可以定义两个 MutableLiveData ,对应两种不同方式获取的数据,因为是同一种数据类型,所以我们可以通过 MediatorLiveData 使用 addSource() 来接管两个 MutableLiveData ,并且传入同一个 Observer,这样我们就只需要在 Observer 中进行操作即可……(细思其实并没什么卵用)

四、小结

其实对于 MediatorLiveData 我们仅需要了解,并且熟悉其源码即可……在实际的开发中,我们使用更多的是 Transformations

只不过在学习 Transformations 之前,MediatorLiveData 是必须要了解的东西。

猜你喜欢

转载自blog.csdn.net/catzifeng/article/details/107349971