我们什么时候应该使用 android.arch.lifecycle:compiler(或 android.arch.lifecycle:common-java8)?
When should we use android.arch.lifecycle:compiler (or android.arch.lifecycle:common-java8)?
目前,我们在项目中使用 LiveData
、ViewModel
和 Room
。
我们正在使用 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:compiler
或 lifecycle:common-java8
。
when do we need to use annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
AFAIK,仅当您的代码中有 lifecycle-related 个注释时才需要,特别是 @OnLifecycleEvent
.
Or implementation "android.arch.lifecycle:common-java8:1.1.1" since we are using Java 8?
同样的事情。文档状态 "If your app uses Java 8, we recommend using this library instead of android.arch.lifecycle:compiler
."
android.arch.lifecycle:compiler:1.1.1 在编写自定义 class 实现 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 个选择:
LifecycleObserver
这是一个标记接口,没有任何方法。您的 class 将实现它,然后您根据需要定义一堆 @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) {}
您的 class 将实现此接口,您可以选择要实现的方法。
此接口是 lifecycle-common-java8
库的一部分。自 Java 8 起支持与某些已实现方法(默认方法)的接口。如果您的项目有 enabled Java 8 language features,您可以使用它。
这是怎么回事
LifecycleEventObserver
和 DefaultLifecycleObserver
将方法添加到您的 class,这可能不是您想要的。这绝对不是我喜欢的。
我希望您创建一个名称在语义上准确的方法,并仅在 应该调用它时告诉生命周期框架。像这样:
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void startListening();
它不会用额外的方法污染你的 class。您可以使用注释处理器使其在 运行 时更快。 (生成的适配器仍然使用反射查找。)
我发现 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"
编译器会生成一个适配器,因此您不必更改 class' 界面。它的工作原理与 DefaultLifecycleObserver
.
完全不同
Java8 的生命周期注释处理器依赖声明应如下所示:
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
而不是:
kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
目前,我们在项目中使用 LiveData
、ViewModel
和 Room
。
我们正在使用 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:compiler
或 lifecycle:common-java8
。
when do we need to use
annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
AFAIK,仅当您的代码中有 lifecycle-related 个注释时才需要,特别是 @OnLifecycleEvent
.
Or implementation "android.arch.lifecycle:common-java8:1.1.1" since we are using Java 8?
同样的事情。文档状态 "If your app uses Java 8, we recommend using this library instead of android.arch.lifecycle:compiler
."
android.arch.lifecycle:compiler:1.1.1 在编写自定义 class 实现 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 个选择:
LifecycleObserver
这是一个标记接口,没有任何方法。您的 class 将实现它,然后您根据需要定义一堆 @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) {}
您的 class 将实现此接口,您可以选择要实现的方法。
此接口是 lifecycle-common-java8
库的一部分。自 Java 8 起支持与某些已实现方法(默认方法)的接口。如果您的项目有 enabled Java 8 language features,您可以使用它。
这是怎么回事
LifecycleEventObserver
和 DefaultLifecycleObserver
将方法添加到您的 class,这可能不是您想要的。这绝对不是我喜欢的。
我希望您创建一个名称在语义上准确的方法,并仅在 应该调用它时告诉生命周期框架。像这样:
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void startListening();
它不会用额外的方法污染你的 class。您可以使用注释处理器使其在 运行 时更快。 (生成的适配器仍然使用反射查找。)
我发现 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"
编译器会生成一个适配器,因此您不必更改 class' 界面。它的工作原理与 DefaultLifecycleObserver
.
Java8 的生命周期注释处理器依赖声明应如下所示:
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
而不是:
kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"