Lifecycle、LiveData、ViewModel讲解之Lifecycle

 Lifecycle、LiveData、ViewModel介绍

在 Android 框架中定义的大多数应用组件都存在生命周期。生命周期由操作系统或进程中运行的框架代码管理。它们是 Android 运作方式的核心,应用必须遵循它们。如果不这样做,可能会引发内存泄露甚至应用崩溃。

  • Lifecycle

(Lifecycle)生命周期感知型组件可执行操作来响应另一个组件(如 Activity 和 Fragment)的生命周期状态的变化。这些组件有助于您写出更有条理且往往更精简的代码,这样的代码更易于维护。

androidx.lifecycle 软件包提供了可用于构建生命周期感知型组件的类和接口 - 这些组件可以根据 Activity 或 Fragment 的当前生命周期状态自动调整其行为。

  • Lifecycle产生的原因

在真实的应用中,最终会有太多管理界面和其他组件的调用,以响应生命周期的当前状态。管理多个组件会在生命周期方法(如 onStart() 和 onStop())中放置大量的代码,这使得它们难以维护。

此外,无法保证组件会在 Activity 或 Fragment 停止之前启动。在我们需要执行长时间运行的操作(如 onStart() 中的某种配置检查)时尤其如此。这可能会导致出现一种竞争条件,在这种条件下,onStop() 方法会在 onStart() 之前结束,这使得组件留存的时间比所需的时间要长。

androidx.lifecycle 软件包提供的类和接口可帮助您以弹性和隔离的方式解决这些问题。

1.Lifecycle

1.1Lifecycle关键类说明

  • Lifecycle

 定义一个有Android生命周期的对象,是一个类,用于存储有关组件(如 Activity 或 Fragment)的生命周期状态的信息,并允许其他对象观察此状态。

使用两种主要枚举跟踪其关联组件的生命周期状态:

事件:从框架和 Lifecycle 类分派的生命周期事件。这些事件映射到 Activity 和 Fragment 中的回调事件。

  public enum Event {
       //生命周期方法
        ON_CREATE,
        ON_START,
        ON_RESUME,
        ON_PAUSE,
        ON_STOP,
        ON_DESTROY,
        //注解以后所有生命周期方法都会回调
        ON_ANY
    }

状态:由 Lifecycle 对象跟踪的组件的当前状态。

public enum State {
        DESTROYED,
        INITIALIZED,
        CREATED,
        STARTED,
        RESUMED;
        public boolean isAtLeast(@NonNull State state) {
            return compareTo(state) >= 0;
        }
    }

构成 Android Activity 生命周期的状态和事件如图:

您可以将状态看作图中的节点,将事件看作这些节点之间的边。

  • LifecycleOwner

LifecycleOwner 是单一方法接口,表示类持有 Lifecycle。它具有一种方法(即 getLifecycle()),该方法必须由类实现。

此接口从各个类(如 Fragment 和 AppCompatActivity)抽象化 Lifecycle 的所有权,并允许编写与这些类搭配使用的组件。任何自定义应用类均可实现 LifecycleOwner 接口。

  • LifecycleObserver

标记一个类作为LifecycleObserver,生命周期观察者回调,LifecycleObserver没有任何方法,依赖OnLifecycleEvent注解方法标示监听生命周期方法;

  • LifecycleRegistry

实现Lifecycle接口,可以同时通知多个LifecycleObserver观察者对象;

注意:实现 LifecycleObserver 的组件可与实现 LifecycleOwner 的组件无缝协同工作,因为所有者可以提供生命周期,而观察者可以注册以观察生命周期。

1.2Lifecycle使用示例(Activity继承AppCompatActivity)

1.2.1引入依赖

在 根目录 的build.gradle文件中,加上google()的远程仓库声明(现在AS创建的工程已经默认包含了该声明)。

allprojects {
    repositories {
        jcenter()
        //加上这一句。
        google()
    }
}

添加Lifecycle依赖有如下两种方式

implementation 'com.android.support:appcompat-v7:28.0.0'

或者

  • 选择仅导入LiveDataViewModelLifecycles的其中一种,或者全部导入。
  • 注解处理器,在Java8上使用common-java8,在Java8以下使用compiler
  • 流式处理支持库reactivestreams
  • 测试支持库core-testing
    def lifecycle_version = "1.1.1"

    // ViewModel and LiveData
    implementation "android.arch.lifecycle:extensions:$lifecycle_version"
    // alternatively - just ViewModel
    implementation "android.arch.lifecycle:viewmodel:$lifecycle_version"
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值