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

Che*_*eng 10 android android-architecture-components

目前,我们正在使用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"
Run Code Online (Sandbox Code Playgroud)

我想知道我们什么时候需要使用

annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
Run Code Online (Sandbox Code Playgroud)

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

目前,我们的代码可以正常运行,而无需使用lifecycle:compilerlifecycle:common-java8

Ben*_*nny 23

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

implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
Run Code Online (Sandbox Code Playgroud)

代替:

kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
Run Code Online (Sandbox Code Playgroud)


Eug*_*nec 14

您的选择

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

LifecycleObserver

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

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

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

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

LifecycleEventObserver

它提供了一个单一的方法

void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event);
Run Code Online (Sandbox Code Playgroud)

它将被调用而不是任何带注释的方法。

这个接口是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) {}
Run Code Online (Sandbox Code Playgroud)

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

这个接口是lifecycle-common-java8库的一部分。从 Java 8 开始支持一些已实现的方法(默认方法)的接口。如果您的项目启用了 Java 8 语言功能,您可以使用它。

怎么办

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

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

@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void startListening();
Run Code Online (Sandbox Code Playgroud)

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

我发现Lifecycle 发行说明中的以下声明不准确:

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"
Run Code Online (Sandbox Code Playgroud)

编译器生成一个适配器,因此您不必更改类的接口。它的工作原理与DefaultLifecycleObserver.


Com*_*are 13

我们什么时候需要使用 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认同)

Sam*_*net 5

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

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

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void disconnectListener() {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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