Android N Java8 java.time

27

我更新到了最新的Android N sdk。唯一不明白的是为什么我不能将java.time引入我的代码中?我认为Java8在Android N中可用。那么为什么Google没有添加java.time包呢?


只是等待是一种选择:Jack现在已经被弃用,Java8 API很快将直接得到支持:https://android-developers.googleblog.com/2017/03/future-of-java-8-language-feature.html - ccpizza
@ccpizza 他们不支持 Android 上 Java 8 的所有功能。 - IgorGanapolsky
1
Java.time的许多功能在ThreeTen-Backport项目中被移植到Java 6和7中。该项目还进一步适用于Android,形成了ThreeTenABP项目;请参见如何使用… - Basil Bourque
4个回答

29

java.time包仅在API 26(Android O)中添加:

https://developer.android.com/reference/java/time/package-summary.html

更新

从Android Gradle Plugin 4.0版本开始,您可以使用java.time API的子集(以及其他一些Java 8语言API),而不需要为您的应用程序设置最低API级别:https://developer.android.com/studio/write/java8-support#library-desugaring

当使用Android Gradle plugin 4.0.0或更高版本构建应用程序时,支持以下一组API:

  • 顺序流(java.util.stream
  • java.time的一个子集
  • java.util.function
  • 最近添加到java.util.{Map,Collection,Comparator}中的内容
  • Optionals(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'
}

21

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


6
谢谢提供大纲。我想我们在使用Java 8时间API方面唯一的选择是https://github.com/JakeWharton/ThreeTenABP。 - IgorGanapolsky
1
@Igor 在 Android-N 的稳定版本发布前,一直都是这样的情况。希望在稳定版本中他们会提供支持。 - Maheshwar Ligade
如果他们还没有添加Time API,那么他们可能不会在Android N中添加。否则,我不知道Google如何决定包含或省略某些API... - IgorGanapolsky
Java.time的许多功能在ThreeTen-Backport项目中被移植到Java 6和7中。该项目还进一步适用于Android,形成了ThreeTenABP项目;请参见如何使用… - Basil Bourque

19

3
这个库已经不再维护,被弃用了,仓库现在已经存档。你现在应该使用Gradle 4.00+ desugaring - Martin Marconcini

6

从 Android Gradle Plugin 4.0.0 开始,我们终于可以放心(几乎)地使用合适的 java.time 包类了: https://developer.android.com/studio/write/java8-support

Optional、java.time、streams 等将由 Android Gradle Plugin 转译为 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,为什么需要去糖化(desugaring)? - IgorGanapolsky
1
Kotlin仍然在许多Java类的基础上运行,我猜他们不能重新实现java.time包以保持向后兼容性? - Gaket

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接