Android LifeCycle 使用以及应用分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android LifeCycle 使用以及应用分析相关的知识,希望对你有一定的参考价值。

参考技术A

在我最近编写的项目中,始终贯穿整个事件流的组件,可能就是 LifeCycle 了,在我眼里,它就像是个通用化的UI生命周期管理对象,在Android View层的生命周期方法被调用时,它可以给所有注册过它的方法发送生命周期事件,然后由你决定是否进行处理。

那么问题来了,这不就是接口+观察者模式就可以实现么?那样它看起来并不像它本身那么酷啊。

话不多说,先上使用场景

例子1 来自我们经典的 sunflower

可能你会特别蒙蔽,不急,我们直接 进入lifecycleScope中看看

上面就是LifeCycle在协程生命周期上的管理体现(google你为什么不早不做,想起了当年被生命周期支配的恐惧)

例子2: 来自自己的项目

首先要说明一下,Android在RxJava + RxAndroid的使用中,内存泄漏是很常见的问题,因为异步任务本身是不会去感知你View的生命周期的,我自己项目中使用的是 autoDispose

三方框架实现了RxJava、RxAndroid任务对LifeCycle的绑定

以上就是两个十分简单的LifeCycle的实际运用,下面分析一下LifeCycle到底做了些什么。

我们通过AppCompatActivity找到他的父类,FragmentActivity的父类, ComponentActivity

看图说话 backwardPass 就是RESUMED 到 DESTROYED 的过程,每次只能变化一次,连续的动作

forwardPass就是INITIALIZED 到 RESUMED 的过程,同样 每次只能变化一次, 连续的动作

这时候问题就来了,为什么要这么做? 而且那个嵌套的判断如何解决在同步的过程中有新的观察者加入的情况

这是可以细化成两个小点

在同步过程中,加入了新观察者

在同步过程中,新状态更变加入

这里又出现了个pushParentState以及popParentState 这个栈又是为了保证什么的呢

为了保证新增的状态不会破坏整个Map的有序性

这时候你会觉得奇怪,有序性?什么有序性

仔细看一下sync就会明白,同步的判断依赖于新加入的订阅者状态肯定新于之前加入的订阅者

这应该算是牺牲一部分性能保证有序性的操作

以上就是Lifecycle一次状态更变的大致流程,看起来确实也没有太多东西,一个观察者模式,一套新规则,解决了长年的生命周期管理问题,看来基于业务的开发才是未来的主流

我们啥时候应该使用 android.arch.lifecycle:compiler(或 android.arch.lifecycle:common-java8)?

【中文标题】我们啥时候应该使用 android.arch.lifecycle:compiler(或 android.arch.lifecycle:common-java8)?【英文标题】:When should we use android.arch.lifecycle:compiler (or android.arch.lifecycle:common-java8)?我们什么时候应该使用 android.arch.lifecycle:compiler(或 android.arch.lifecycle:common-java8)? 【发布时间】:2018-09-11 03:31:39 【问题描述】:

目前,我们在项目中使用LiveDataViewModelRoom

我们使用的是 Java 8。

我们在build.gradle中使用以下内容

// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:1.1.1"

// Room (use 1.1.0-beta1 for latest beta)
implementation "android.arch.persistence.room:runtime:1.0.0"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0"

我在想,我们什么时候需要使用

annotationProcessor "android.arch.lifecycle:compiler:1.1.1"

(或者implementation "android.arch.lifecycle:common-java8:1.1.1",因为我们使用的是Java 8?!)

目前,我们的代码运行良好,无需使用lifecycle:compilerlifecycle:common-java8

【问题讨论】:

【参考方案1】:

我们什么时候需要使用annotationProcessor "android.arch.lifecycle:compiler:1.1.1"

AFAIK,仅当您的代码中有与生命周期相关的注释时才需要,特别是 @OnLifecycleEvent

或者实现“android.arch.lifecycle:common-java8:1.1.1”,因为我们使用的是 Java 8?

同样的事情。文档声明“如果您的应用使用 Java 8,我们建议使用此库而不是 android.arch.lifecycle:compiler。”

【讨论】:

虽然没有必要 - 使用 OnLifecycleEvent 注释的方法将使用反射调用【参考方案2】:

Java 8 的生命周期注解处理器依赖声明应如下所示:

implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"

代替:

kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"

【讨论】:

【参考方案3】:

您的选择

据我所知,您有 3 个选项:

LifecycleObserver

它是一个标记接口,它没有任何方法。您的类将实现它,然后您根据需要定义一堆 @OnLifecycleEvent 方法。

生命周期运行时会做两件事之一:

使用反射查找带注释的方法, 如果您启用了lifecycle-compiler 注释处理器,则使用生成的适配器。

此接口是lifecycle-common 库的一部分。

LifecycleEventObserver

它提供了一个单一的方法

void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event);

这将被称为 而不是 任何带注释的方法。

此接口是lifecycle-common 库的一部分。

DefaultLifecycleObserver

它提供了一个带有几个空方法的接口:

default void onCreate(@NonNull LifecycleOwner owner) 
default void onStart(@NonNull LifecycleOwner owner) 
default void onResume(@NonNull LifecycleOwner owner) 
default void onPause(@NonNull LifecycleOwner owner) 
default void onStop(@NonNull LifecycleOwner owner) 
default void onDestroy(@NonNull LifecycleOwner owner) 

您的类将实现此接口,您可以选择要实现的方法。

此接口是lifecycle-common-java8 库的一部分。自 Java 8 起支持具有一些已实现方法(默认方法)的接口。如果您的项目有 enabled Java 8 language features,则可以使用它。

怎么做

LifecycleEventObserverDefaultLifecycleObserver 向你的类添加方法,这可能不是你想要的。这绝对不是我喜欢的。

我希望您创建一个具有语义准确名称的方法,并仅告诉 Lifecycle 框架何时它应该调用它。像这样:

@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void startListening();

它不会用额外的方法污染你的班级。您可以使用注释处理器使其在运行时更快。 (仍然使用反射查找生成的适配器。)

我发现Lifecycle release notes的这个说法不准确:

annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version" // For Kotlin use kapt instead of annotationProcessor
// alternately - if using Java8, use the following instead of lifecycle-compiler
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"

编译器会生成一个适配器,因此您不必更改类的接口。它与DefaultLifecycleObserver 完全不同。

【讨论】:

【参考方案4】:

android.arch.lifecycle:compiler:1.1.1 在编写实现 LifecycleObserver 的自定义类时使用

public class MyObserver implements LifecycleObserver 
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void connectListener() 
        ...
    

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void disconnectListener() 
        ...
    

摘自https://developer.android.com/topic/libraries/architecture/lifecycle.html

【讨论】:

链接加一个

以上是关于Android LifeCycle 使用以及应用分析的主要内容,如果未能解决你的问题,请参考以下文章

Android Jetpack组件 - ViewModel,LiveData使用以及原理

Android: 彻底搞懂Lifecycle——使用篇

Android jetpack LifeCycle 在Application中的应用

Android jetpack LifeCycle 在Services中的应用

Android Jetpack架构组件——Lifecycle使用篇

Android Jetpack架构组件——Lifecycle使用篇