炮灰亲述!Jetpack使用中我踩过的那些坑---

因为LiveData是抽象类,MutableLiveData是它的一个实现类。其中定义了postValue和setValue用来通知观察者更新数据。postValue为异步操作。setValue为同步操作。

接着我们在Activity中创建ViewModel并将UI组件和LiveData进行绑定以便进行数据的更新。

class SecondActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

setContentView(R.layout.activiry_second)

val secondViewModel = ViewModelProviders.of(this).get(SecondViewModel::class.java)

secondViewModel.userData.observe(this, Observer {
mTvShow.text = “姓名:KaTeX parse error: Undefined control sequence: \n at position 11: {it.name} \̲n̲薪水:{it.salary}”
})

/**

  • 模拟数据源更新
    */
    mBtnData.setOnClickListener {
    secondViewModel.getUserInfo()
    }
    }
    }

这里通过ViewModelProviders来获取ViewModelProvider在通过get方法来获取ViewModel实例。我们通过button按钮注册了一个点击事件来模拟数据源数据的更新。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据转换

如果我们想对从服务端获取到的数据进行修改可以使用Transformations操作符。分为Map和switchMap两种。switchMap需要返回一个LiveData对象。

Transformations.map

Transformations.map(secondViewModel.userData, object : Function<UserInfo, UserInfo> {
override fun apply(userInfo: UserInfo): UserInfo {
userInfo.name = “张三”
return userInfo
}

}).observe(this, Observer {
mTvShow.text = “姓名:KaTeX parse error: Undefined control sequence: \n at position 11: {it.name} \̲n̲薪水:{it.salary}”
})

这就将name重新赋值为“张三”。

Transformations.switchMap

比如我们有些数据需要依赖其他数据进行查询,就可以使用switchMap。

Transformations.switchMap(secondViewModel.userData, object : Function<UserInfo, LiveData> {
override fun apply(userInfo: UserInfo): LiveData {
return secondViewModel.getUserName(userInfo)
}
}).observe(this, Observer {
mTvShow.text = “姓名:KaTeX parse error: Undefined control sequence: \n at position 11: {it.name} \̲n̲薪水:{it.salary}”
})

在ViewModel中定义getUserName方法

fun getUserName(userInfo: UserInfo): LiveData {
userInfo.name = userInfo.name + “switchMap”
switchMapData.value = userInfo
return switchMapData
}

MediatorLiveData

当我们页面需要多个不同的数据源的时候,如果我们都是单独的使用LiveData,会导致Activity中定义很多observe,出现很多多余的代码。MediatorLiveData就为解决这个问题的。它可以将多个LiveData合并在一起,只需要定义一次observe就可以。

var data1: MutableLiveData = MutableLiveData()
var data2: MutableLiveData = MutableLiveData()
var mediatorLiveData: MediatorLiveData = MediatorLiveData()

val user1 = UserInfo(“李四1”, (1000…5000).random())
val user2 = UserInfo(“李四2”, (1000…5000).random())

data1.postValue(user1)
data2.postValue(user2)

mediatorLiveData.addSource(data1, object : Observer {
override fun onChanged(info: UserInfo) {
mediatorLiveData.value = info
}

})

mediatorLiveData.addSource(data2, object : Observer {
override fun onChanged(info: UserInfo) {
mediatorLiveData.value = info
}

})

这个我们定义了两个MutableLiveData表示正常的数据获取。MediatorLiveData通过addSource方法将data1和data2合并一起组成新的LiveData。onChanged回调表示的是当data1和data2数据源数据发送变化的时候进行回调。通知界面UI进行数据刷新。

我们在Activity中使用:

secondViewModel.mediatorLiveData.observe(this, Observer {
if (it.name.contains(“1”)) {
mTvShow.text = “姓名:KaTeX parse error: Undefined control sequence: \n at position 11: {it.name} \̲n̲薪水:{it.salary}”
} else {
mTvShowOther.text = “姓名:KaTeX parse error: Undefined control sequence: \n at position 11: {it.name} \̲n̲薪水:{it.salary}”
}

})

这里就简单的通过name来判断不同的数据源类型。这样就将data1和data2首次请求的数据在界面展示了。上文也讲了onChanged是监听data1和data2数据变化的。这里我们在XML布局文件中新加一个button按钮用来模拟数据源变化。

然后在ViewModel中第一模拟刷新方法:

/**

  • 模拟data1和data2数据源改变
    */
    fun update() {

val updateUser1 = UserInfo(“李四1 update”, (1000…5000).random())
val updateUser2 = UserInfo(“李四2 update”, (1000…5000).random())

data1.postValue(updateUser1)
data2.postValue(updateUser2)

}

postValue执行完成后onChanged方法将接受到回调并通知UI更新数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

扩展LiveData

如果观察者的生命周期处于STARTED或RESUMED状态,则LiveData认为观察者处于活动状态。如果我们知道什么时候是active和inactive,那么我们可以自己实现LiveDta。所以LiveData提供了两个方法,分别为onActive()与onInactive()。并给出了官方Demo:

class StockLiveData(symbol: String) : LiveData() {
private val stockManager = StockManager(symbol)

private val listener = { price: BigDecimal ->
value = price
}

override fun onActive() {

学习分享,共勉

Android高级架构师进阶之路

题外话,我在阿里工作多年,深知技术改革和创新的方向,Android开发以其美观、快速、高效、开放等优势迅速俘获人心,但很多Android兴趣爱好者所需的进阶学习资料确实不太系统,完整。今天我把我搜集和整理的这份学习资料分享给有需要的人

  • Android进阶知识体系学习脑图

  • Android进阶高级工程师学习全套手册

  • 对标Android阿里P7,年薪50w+学习视频

  • 大厂内部Android高频面试题,以及面试经历


《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
340335973)]

  • 大厂内部Android高频面试题,以及面试经历

[外链图片转存中…(img-TRlS4AuW-1715340335973)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值