Google 宣布废弃 LiveData.observe 方法



通过这篇文章你将学习到以下内容:
我们先来看看官方是如何解释,如下图所示:

在 Kotlin 1.4 上本身能够将默认的 observe() 方法转换为 lambda 语法,以前只有在使用 Kotlin 扩展时才可用。因此将 LiveData.observe() 扩展方法废弃掉了。
在 Kotlin 1.4 之前 LiveData.observe() 写法如下所示。
liveData.observe(this, Observer<String> {
// ......
})但是这种写法有点复杂,因此 Google 在 lifecycle-livedata-ktx库中添加了扩展方法,使代码更简洁,可读性更强。
liveData.observe(this){
// ......
}
在 Kotlin 1.4 时,增加了一个新的特性 SAM conversions for Kotlin interfaces,支持将 SAM(单一抽象方法)接口,转换成 lambda 表达式,因此废弃了 LiveData.observe() 扩展方法。所以升级 lifecycle-livedata-ktx 库到最新版本,将会出现如下提示。
https://kotlinlang.org/docs/whatsnew14.html#sam-conversions-for-kotlin-interfaces


迁移也非常简单,升级到 Kotlin 1.4 之后,只需要移除掉下列包的导入即可。
import androidx.lifecycle.observe接下来我们一起来了解一下 LiveData.observe() 扩展方法的由来,源于一位大神在 issuetracker 上提的一个问题, 如下图所示:
https://issuetracker.google.com/issues/111179594?pli=1

大神认为 SAM 转换,可以使代码更简洁,可读性更强,因此期望 Google 能够支持,现阶段 LiveData.observe() 写法相比 java8 是比较复杂的。
// java8
liveData.observe(owner, name -> {
// ......
});
// SAM 转换之前
liveData.observe(this, Observer { name ->
// ......
})
// SAM 转换之后
liveData.observe(this){ name ->
// ......
} 这里需要插入两个 Kotlin 语法的知识点:
什么是函数式(SAM)接口
只有一个抽象方法的接口称为函数式接口或 SAM(单一抽象方法)接口。函数式接口可以有多个非抽象成员,但只能有一个抽象成员。
什么是 SAM 转换
对于函数式接口,可以通过 lambda 表达式实现 SAM 转换,从而使代码更简洁,可读性更强,代码如下所示。
fun interface ByteCode {
fun follow(name: String)
}
fun testFollow(bytecode: ByteCode) {
// ......
}
// 传统的使用方法
testFollow(object : ByteCode{
override fun follow(name: String) {
// ......
}
})
// SAM 转换
testFollow{
// ......
}
在 Kotlin 1.4 之前不支持实现 SAM 转换,于是 Google 在 lifecycle-livedata-ktx 库中添加了 LiveData.observe() 扩展方法,commit 如下图所示。

在 Kotlin 1.4 之后, Kotlin 开始支持 SAM 转换,所以 Google 废弃 LiveData.observe() 扩展方法, Google 工程师也对此进行了讨论,如下图所示。

大神 Sergey Vasilinets 建议,为了不破坏源代码兼容性,只是在这个版本中弃用。在以后的版本更新中将会更新错误级别为 error,因此在这里建议如果已经升级到了 Kotlin 1.4,将下列包的导入从代码中移除即可。
import androidx.lifecycle.observe在 Kotlin 1.5.0 中使用 dynamic invocations (invokedynamic) 进行编译,实现 SAM(单一抽象方法) 转换,这个就不在本文讨论范围内,放在以后进一步分析。
https://kotlinlang.org/docs/whatsnew15.html#sam-adapters-via-invokedynamic
往 期 推 荐
1、致歉!抖音Semi Design承认参考阿里Ant Design 2、对比7种分布式事务方案,还是偏爱阿里开源的Seata,真香! 3、Redis存储结构体信息,选hash还是string? 4、扫盲 docker 常用命令 5、最全分布式Session解决方案 6、21 款 yyds 的 IDEA插件 7、真香!用 IDEA 神器看源码,效率真高! 点分享
点收藏
点点赞
点在看





