[JetPack] androidx.lifecycle 库中 ViewModel 的新旧版本 API 差异
1.背景
谷歌官方的 JetPack 框架给开发者带来了丰富、好用的接口组件,很大程度上提升了应用质量和开发效率。但在开发过程中,笔者遇到一个问题,从截图(如下)上面可以看到,旧版本的 API 被添加了 Deprecated,也就是 不给推荐使用。
1.1 ViewModelProviders 来源
从截图及 AndroidStudio 开发工具可以看到,这个类是属于 androidx.lifecycle:lifecycle-extensions:2.2.0 下面的。是通过 build.gradle 中导入进来的。
1.2 ViewModelProvider 来源
从截图及 AndroidStudio 开发工具可以看到,这个类是属于 androidx.lifecycle:lifecycle-viewmodel:2.2.0 下面的。但是其是从哪里导入进来的呢?我项目里面没有找到显示的声明。
1.3 从哪里导入 androidx.lifecycle:lifecycle-viewmodel:2.2.0
从上图的 ViewModelProviders 源码可以发现,其依赖了 androidx.lifecycle.ViewModelProvider.Factory 包名,因此,我们猜测通过依赖 lifecycle-extensions 库,间接的依赖了 lifecycle-viewmodel 库及相关系列库。我们在官网的说明中也可以找到提醒:“lifecycle-extensions 中的 API 已弃用。您可以为特定 Lifecycle 工件添加所需的依赖项”。
(https://developer.android.com/jetpack/androidx/releases/lifecycle?hl=zh-cn#version_220_3)
2.ViewModelProviders 接口构造 ViewModel 的实现原理
查看 ViewModelProviders.of(this) 方法
结论:可以看到,ViewModelProviders 只是封装了一个静态方法 of 来新建一个 ViewModelProvider 对象,与直接 new 一个 ViewModelProvider 的方式,本质上是相同的,因此,可以建议使用新 API 的方法。
3.为什么要 抛弃 ViewModelProviders 的构造方法,存在什么问题,或者 新 API 有什么优势呢?
我们可以从官网说明中以及上文的推理,由于在以往的开发中通过依赖 lifecycle-extensions 库,间接的依赖了 lifecycle-viewmodel 库及相关系列库。(高内聚低耦合是很多软件开发的进化方向)随着 JetPack 组件的升级,lifecycle 库也将拆分的更加低耦合,有时我们只需 lifecycle 中的一个子库,并不需要全部依赖进来,可以在某种程度上减少代码量和应用体积。下面是官方的说明。
4. 总结
本文简单介绍了 JetPack 组件中 lifecycle 库不同版本间 API 的差异,学习到在开发 SDK 的过程中可以使用 Deprecated 注解来标记方法的改动,既不影响开发者使用旧版本的二次开发,也可以提醒开发者有新的版本更新,AndroidStudio 也是相当智能的,特别喜欢 Google 的开发文化,谢谢关注,祝大家周末愉快 ^-^。
版权声明: 本文为 InfoQ 作者【Changing Lin】的原创文章。
原文链接:【http://xie.infoq.cn/article/682b14f5ffc864b70ffee0ca4】。文章转载请联系作者。
评论