android Jetpack LiveData用法你知道吗?( 二 )

其实MediatorLiveData最常用的用法是结合Transformation来使用,下面将介绍Transformation的用法
Transformation 转换Transformation内部原理使用MediatorLiveData实现的
有的时候我们需要对当前data 转换成我们需要的另一种data
比如rxJAVA的map方法
Flowable.range(1, 10) .map { "index: $it" } .subscribe {}再比如 kotlin自带的map扩展方法
val list = listOf(1, 2, 3, 4).map { "index: $it"}LiveData 也提供了类似的map功能
// 创建LiveDataval userLiveData: LiveData<User> = MutableLiveData<User>()val userName: LiveData<String> = Transformations.map(userLiveData) { user -> "${user.name} ${user.lastName}"}//观察数据的更新userName.observe(this, Observer { tv_text.text = it})...// 更新数据userLiveData.value = https://www.isolves.com/it/cxkf/ydd/Android/2019-08-01/User("zhang", "san")LiveData 也提供了switchMap方法转换数据,它与map唯一的不同是将data转换成一个LiveData<T>,因此在转换过程中可以继续做异步操作请求数据等,他跟rxjava的flatmap方法有点像
// 先使用room数据库定义一个UserDao example@Daoabstract class UserDao { @Query("select * from tab_user where uid = :uid") abstract fun getById(uid: Long): LiveData<User>} ...private fun getUser(id: String): LiveData<User> { // 可以使用room数据查询user对象 // return AppDataBase.getUserDao().getUser(id) // 你也可以发网络请求查询user对象 return object: LiveData<User>() { override fun onActive() { super.onActive() // 模拟网络请求数据 Flowable.timer(3, TimeUnit.SECONDS) .subscribe { postValue(User("zhang", "san")) } } }}...val userId: LiveData<String> = MutableLiveData<String>()val user = Transformations.switchMap(userId) { id -> getUser(id) }//观察数据的更新user.observe(this, Observer { tv_text.text = "${it.name} ${it.name}"})...// 更新数据userId.value = https://www.isolves.com/it/cxkf/ydd/Android/2019-08-01/"001"LiveData使用起来比较简单,功能就介绍到这里,建议查看一下官方demo 学习结合其它library的用法




推荐阅读