我是 Java 和 Android 的新手,我花了好几个小时也没弄明白这个问题。所以我想我应该把我所学到的东西记录下来,给那些可能正在苦苦挣扎的人们。
正在使用 Android Studio 2.1.2。 Java 设置如下:
>java -version> openjdk version "1.8.0_91"> OpenJDK Runtime Environment (build 1.8.0_91-8u91-b14-3ubuntu1~15.10.1-b14)> OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)
首先: 为什么必须用ThreeTenABP 3 / 10 abp Instead of 而不用java.time, ThreeTen-Backport 30-backport, or even 或甚至Joda-Time
这只是定义新标准的漫长过程的一个简短版本。所有这些包几乎都是一样的东西: 为 Java 提供良好的、现代的处理功能的库。这些差异虽然微妙,但却很重要。
最明显的解决方案是使用内置的 Java.time 包,因为这是在 Java 中处理时间和日期的新标准方法。 它是 JSR 310的一个实现,JSR 310是基于 Joda-Time 库的一个新的时间处理标准提案。
然而,Java.time 是在 java8中引入的。 安卓直至 Marshmallow 在 java7上运行(“ android N”是第一个引入 java8语言特性的版本)。 因此,除非你只针对 Android n Nougat 或更高的版本,否则你不能依赖 Java 8的语言特性(我不确定这是否是100% 正确的,但我是这样理解的)。 所以 java.time 过时了。
下一个选项可能是 Joda-Time,因为 JSR 310是基于 Joda-Time 的。 然而,正如 ThreeTenABP 自述文件所指出的,由于多种原因,Joda-Time 并不是最佳选择。
接下来是 ThreeTen-Backport,它将许多(但不是全部) java8java.time 功能返回到 java7。 对于大多数用例来说,这是可以接受的,但是,正如 ThreeTenABP 自述文件中指出的那样,它在 Android 中存在性能问题。
因此,最后一个看似正确的选择是 ThreeTenABP。
其次: 构建工具和依赖管理
由于编译一个程序(尤其是使用大量外部库的程序)是复杂的,所以 Java 几乎总是使用“构建工具”来管理流程。 Make、 apacheant、 apachemaven 和 Gradle 都是 Java 程序中使用的构建工具(参见本文进行比较)。 如上所述,Gradle 是 Android 项目选择的构建工具。
这些构建工具包括依赖管理。 Apachemaven 似乎是第一个包含集中式软件包存储库的软件。 引入了 Maven 中央储存库,它允许相当于 php 编写器的功能与 Packagist 和 Ruby 的 gem with rubygems. org。 换句话说,Maven 中央存储库对于 Maven (和 Gradle)来说就像 Packagist 对于 composer 一样——为版本化的软件包提供权威和安全的源代码。
然后: Gradle 处理 Android 项目中的依赖关系
我的首要任务是阅读 Gradle 文档,包括他们的免费电子书。如果开始学习 Android 的时候读到这些,肯定会知道 Gradle 可以使用 Maven 中央仓库来管理 Android 项目中的依赖关系。 此外,正如 StackOverflow 回答中详细说明的那样,在 Android Studio 0.8.9中,Gradle 通过 Bintray 的 JCenter 使用 Maven Central Repository,这意味着你不需要做任何额外的配置来设置回购---- 你只需列出dependencies。
接着: 项目依赖项列在[项目目录] app/build.gradle
同样,对于那些有在 Java 中使用 Gradle 的经验的人来说是显而易见的,但是我花了一段时间才弄明白这一点。 如果您看到有人说“只需添加 compile‘ this-or-that.jar'”或类似的内容,那么要知道 compile 是 build.gradle 文件中指示编译时依赖关系的指令。
还有: ThreeTenABP 由Jake Wharton管理,而非 ThreeTen
还有一个问题我花了太多时间去解决。 如果在 Maven Central 中查找 ThreeTen,则只会看到 threetenbp 包,而不是 threetenabp 包。 如果转到 ThreeTenABP 的 github repo,您将在 Readme 的下载部分看到口碑奇差的compile 'this-or-that'
当我第一次点击这个 github repo 时,我不知道这个编译行意味着什么,我试图在我的终端上运行它(结果显然是可预见的失败)。 很沮丧,我没有return它,直到我弄明白了其余的部分,并最终意识到这是一个 Maven Repo 行指向 com.jakewharton.threetenabp Repo,而不是 org.threeten Repo。 这就是为什么我认为ThreeTenABP 包不在 Maven repo中的原因。
总结: 要发挥作用
现在事情就简单多了,通过在 dependencies 部分确保 [project folder]/app/build.gradle 文件能够有一行 compile 'com.jakewharton.threetenabp:threetenabp:1.0.3' ,就可以在 Android 项目中快速运算函数了。
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "me.ahuman.myapp"
minSdkVersion 11
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
testImplementation 'junit:junit:4.12'
implementation 'com.android.support:appcompat-v7:23.4.0'
implementation 'com.android.support:design:23.4.0'
implementation 'com.jakewharton.threetenabp:threetenabp:1.0.3'}