我们什么时候应该使用 android.arch.life cycle: 编译器(或 android.arch.life cycle: common-java8) ?

目前,我们正在使用 LiveDataViewModelRoom在我们的项目。

我们正在使用 Java8。

我们在 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",因为我们使用的是 Java8? !)

目前,我们的代码工作良好,没有使用 lifecycle:compilerlifecycle:common-java8

25513 次浏览

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

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

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

同样的,文档声明“如果您的应用程序使用 Java8,我们建议使用这个库而不是 android.arch.lifecycle:compiler。”

生命周期: 编译器: 1.1.1用于编写实现 LificycleObserver 的自定义类

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

你的选择

在我看来你有三个选择:

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库的一部分。自 Java8以来,支持带有一些实现方法(默认方法)的接口。如果您的项目有 启用的 Java8语言特性,您可以使用它。

怎么解释

LifecycleEventObserverDefaultLifecycleObserver将方法添加到您的类中,这可能不是您想要的。这绝对不是我喜欢的。

我希望您创建一个具有语义准确名称的方法,并告诉 Lificycle 框架应该只调用 什么时候。像这样:

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

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

我认为 生命周期发布说明的这句话不准确:

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完全不同。

Java8的生命周期注释处理器依赖性声明应该如下:

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

而不是:

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