【问题标题】:Android N Java8 java.timeAndroid IN Java 8 java.time
【发布时间】:2016-03-15 01:14:47
【问题描述】:

我更新到最新的 Android N sdk。我唯一不明白的是为什么我不能将java.time 导入到我的代码中?我以为Java8可以通过Android N获得。那为什么谷歌没有添加java.time包?

【问题讨论】:

标签: android java-8 java-time android-7.0-nougat


【解决方案1】:

java.time 包仅在 API 26 (Android O) 中添加: https://developer.android.com/reference/java/time/package-summary.html

更新

但是,从 4.0 版开始,Android Studio 允许使用 java.time API 的子集(以及许多其他 Java 8 语言 API),无需为您的应用设置最低 API 级别:
https://developer.android.com/studio/preview/features#j8-desugar

此版本支持以下 API 集:

  • 顺序流 (java.util.stream)
  • java.time 的子集
  • java.util.function
  • 最近添加到java.util.{Map,Collection,Comparator}
  • 可选(java.util.Optionaljava.util.OptionalIntjava.util.OptionalDouble)和其他一些对 以上API
  • java.util.concurrent.atomic 的一些补充(AtomicIntegerAtomicLongAtomicReference 上的新方法)
  • ConcurrentHashMap(修复了 Android 5.0 的错误)

要启用对这些语言 API 的支持,需要包含以下行 build.gradle 文件:

android {
  defaultConfig {
    // Required when setting minSdkVersion to 20 or lower
    multiDexEnabled true
  }

  compileOptions {
    // Flag to enable support for the new language APIs
    coreLibraryDesugaringEnabled true
    // Sets Java compatibility to Java 8
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

dependencies {
  coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.4'
}

【讨论】:

    【解决方案2】:

    Android N 不支持 Java 8 的所有功能。 仅支持以下功能:

    • 默认和静态接口方法
    • Lambda 表达式
    • 可重复的注释

    反射和语言相关的 API:

    • java.lang.FunctionalInterface
    • java.lang.annotation.Repeatable
    • java.lang.reflect.Method.isDefault()

    以及与可重复注释相关联的反射 API,例如 AnnotatedElement.getAnnotationsByType(Class)

    实用程序 API:

    • java.util.function

    欲了解更多信息,请查看以下链接:http://developer.android.com/preview/j8-jack.html

    【讨论】:

    • 感谢您的大纲。我猜我们对 Java 8 Time api 的唯一选择是 github.com/JakeWharton/ThreeTenABP
    • @Igor 直到 android-n 的稳定版本发布。希望稳定版能支持
    • 好吧,如果他们还没有添加 Time api,那么他们可能不会在 Android N 中。否则,我不知道 Google 如何决定包含或省略某些 api...
    • ThreeTen-Backport 项目中的大部分 java.time 功能都向后移植到 Java 6 和 7。在ThreeTenABP项目中进一步适配Android;见How to use…
    【解决方案3】:

    有可用于 Android 的 java.time API 的 backport 库

    https://github.com/JakeWharton/ThreeTenABP

    【讨论】:

    【解决方案4】:

    从 Android Gradle Plugin 4.0.0 开始,我们终于可以无忧无虑地使用正确的 java.time 包类(几乎): https://developer.android.com/studio/write/java8-support

    Optional, java.time, streams,以及更多内容被 Android Gradle 插件脱糖到 Java 7 中。

    要添加这些类支持,您只需在构建文件中添加几行:

    android {
      defaultConfig {
        // Required when setting minSdkVersion to 20 or lower
        multiDexEnabled true
      }
    
      compileOptions {
        // Flag to enable support for the new language APIs
        coreLibraryDesugaringEnabled true
        // Sets Java compatibility to Java 8
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
      }
    }
    
    dependencies {
      coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.9'
    }
    

    这里是完整列表:https://developer.android.com/studio/write/java8-support-table

    【讨论】:

    • 如果我们使用 Kotlin,为什么需要脱糖?
    • Kotlin 仍然在底层使用许多 Java 类,我猜他们不能仅仅重新实现 java.time 包以保持向后兼容性?
    猜你喜欢
    • 1970-01-01
    • 2022-01-02
    • 2014-05-12
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 2014-11-02
    相关资源
    最近更新 更多