写点什么

[JetPack] androidx.lifecycle 库中 ViewModel 的新旧版本 API 差异

用户头像
Changing Lin
关注
发布于: 2021 年 01 月 23 日
[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) 方法


		@Deprecated    @NonNull    @MainThread    public static ViewModelProvider of(@NonNull FragmentActivity activity) {        return new ViewModelProvider(activity);    }
复制代码


  • 结论:可以看到,ViewModelProviders 只是封装了一个静态方法 of 来新建一个 ViewModelProvider 对象,与直接 new 一个 ViewModelProvider 的方式,本质上是相同的,因此,可以建议使用新 API 的方法。

3.为什么要 抛弃 ViewModelProviders 的构造方法,存在什么问题,或者 新 API 有什么优势呢?

我们可以从官网说明中以及上文的推理,由于在以往的开发中通过依赖 lifecycle-extensions 库,间接的依赖了 lifecycle-viewmodel 库及相关系列库。(高内聚低耦合是很多软件开发的进化方向)随着 JetPack 组件的升级,lifecycle 库也将拆分的更加低耦合,有时我们只需 lifecycle 中的一个子库,并不需要全部依赖进来,可以在某种程度上减少代码量和应用体积。下面是官方的说明。

 

dependencies {    def lifecycle_version = "2.2.0"    def arch_version = "2.1.0"
    // ViewModel    implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"    // LiveData    implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"    // Lifecycles only (without ViewModel or LiveData)    implementation "androidx.lifecycle:lifecycle-runtime:$lifecycle_version"
    // Saved state module for ViewModel    implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:$lifecycle_version"
    // Annotation processor    annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"    // alternately - if using Java8, use the following instead of lifecycle-compiler    implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
    // optional - helpers for implementing LifecycleOwner in a Service    implementation "androidx.lifecycle:lifecycle-service:$lifecycle_version"
    // optional - ProcessLifecycleOwner provides a lifecycle for the whole application process    implementation "androidx.lifecycle:lifecycle-process:$lifecycle_version"
    // optional - ReactiveStreams support for LiveData    implementation "androidx.lifecycle:lifecycle-reactivestreams:$lifecycle_version"
    // optional - Test helpers for LiveData    testImplementation "androidx.arch.core:core-testing:$arch_version"}
复制代码


4. 总结

本文简单介绍了 JetPack 组件中 lifecycle 库不同版本间 API 的差异,学习到在开发 SDK 的过程中可以使用 Deprecated 注解来标记方法的改动,既不影响开发者使用旧版本的二次开发,也可以提醒开发者有新的版本更新,AndroidStudio 也是相当智能的,特别喜欢 Google 的开发文化,谢谢关注,祝大家周末愉快 ^-^。



发布于: 2021 年 01 月 23 日阅读数: 34
用户头像

Changing Lin

关注

获得机遇的手段远超于固有常规之上~ 2020.04.29 加入

我能做的,就是调整好自己的精神状态,以最佳的面貌去面对那些未曾经历过得事情,对生活充满热情和希望。

评论

发布
暂无评论
[JetPack] androidx.lifecycle库中ViewModel的新旧版本API差异