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

时间:2018-04-01 20:39:18

标签: 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"

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

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

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

目前,我们的代码运行正常,不使用lifecycle:compilerlifecycle:common-java8

4 个答案:

答案 0 :(得分:13)

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

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

代替:

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

答案 1 :(得分:3)

  

我们何时需要使用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。”

答案 2 :(得分:2)

android.arch.lifecycle:编译器: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

答案 3 :(得分:1)

您的选项

据我所知,您有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完全不同。