【问题标题】: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

【问题讨论】:

    标签: android android-architecture-components


    【解决方案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

        【讨论】:

        • 链接加一个
        猜你喜欢
        • 2021-09-07
        • 2011-03-18
        • 1970-01-01
        • 2011-07-04
        • 2017-09-13
        • 2021-12-29
        • 2011-07-17
        • 2022-01-26
        • 1970-01-01
        相关资源
        最近更新 更多