如何在Android Project中使用ThreeTenABP

How to use ThreeTenABP in Android Project

我问这个问题是因为我是Java和Android的新手,我花了好几个小时试图解决这个问题。答案来自于相关答案的组合,所以我想我会记录下我为其他可能正在挣扎的人所学到的东西。见答案。

我正在使用Android Studio 2.1.2。我的Java设置如下:

1
2
3
4
>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而不是java.time、threeten backport,甚至joda time

这是定义新标准的非常长的过程的一个非常短的版本。所有这些包几乎都是一样的:为Java提供良好的、现代的时间处理功能的库。这些差异很细微,但很重要。好的。

最明显的解决方案是使用内置的EDCOX1×0封装,因为这是在Java中处理时间和日期的新标准方法。它是JSR 310的一个实现,这是一个基于Joda时间库的新的时间处理标准提案。好的。

然而,在Java 8中引入了EDCOX1 0。Android到棉花糖上运行在Java 7("Android N"是第一个引入Java 8语言特性的版本)。因此,除非你只针对Android NoGuAT和以上,否则你不能依赖Java 8语言特性(我不确定这是100%真的,但这就是我理解它的方式)。所以java.time不在了。好的。

下一个选项可能是joda time,因为jsr 310基于joda time。然而,正如threetenabp自述所指出的,出于许多原因,joda time不是最佳选择。好的。

接下来是三重后端,它将Java 8 EDCOX1 0功能的大部分(但不是全部)返回到Java 7。对于大多数用例来说,这是很好的,但是正如threetenabp自述中所指出的,它在Android中存在性能问题。好的。

所以最后一个看似正确的选择是三连胜。好的。第二个发现:构建工具和依赖关系管理

因为编译一个程序——尤其是使用一组外部库——是一个复杂的过程,Java几乎总是使用一个"构建工具"来管理这个过程。Apache、Apache Ant、Apache Maven和Gradle都是与Java程序一起使用的构建工具(参见此帖子进行比较)。如下文所述,Gradle是为Android项目选择的构建工具。好的。

这些构建工具包括依赖关系管理。ApacheMaven似乎是第一个包含集中式包存储库的软件。Maven引入了Maven中央存储库,它允许与PHP的composer和Ruby的gem功能相当的Packaginst和RubyGems.org。换句话说,Maven中央存储库对Maven(和Gradle)来说就像Packaginst对Composer一样——是版本化包的一个确定和安全的源。好的。第三个发现:Gradle处理Android项目中的依赖关系

在我的待办事项列表中,最重要的是阅读这里的Gradle文档,包括他们的免费电子书。如果我在几周前开始学习Android的时候读到的话,我肯定知道Gradle可以使用Maven中央存储库来管理Android项目中的依赖关系。此外,正如这个stackoverflow答案中详细描述的,从android studio 0.8.9开始,Gradle通过bintray的jcenter隐式地使用maven中央存储库,这意味着您不必进行任何额外的配置来设置repo——只需列出依赖项即可。好的。第四个发现:项目依赖项列在[project dir]/app/build.gradle中

同样,对于那些在Java中使用Gealle有经验的人来说,这是显而易见的,但我花了很长时间才明白这一点。如果你看到有人说"哦,只需添加compile 'this-or-that.jar'"或类似的话,就知道compile是build.grade文件中指示编译时依赖性的一个指令。这是关于依赖关系管理的官方渐变页面。好的。第五个发现:threetenabp由jake wharton管理,而不是由threeten管理

还有一个问题我花了太多时间去弄清楚。如果你在马文中心找三个,你只能看到threetenbp的包,而不是threetenabp。如果你去Github repo购买threetenabp,你会在自述文件的下载部分看到臭名昭著的compile 'this-or-that'行。好的。

当我第一次点击这个github repo时,我不知道编译行的意思,我试图在我的终端中运行它(有一个明显的和可预测的失败)。我很沮丧,直到很长一段时间我才回到这个话题上,最后我意识到这是一条指向com.jakewharton.threetenabprepo的maven repo线,而不是org.threetenrepo。这就是为什么我认为"三连胜"计划不在马文回购协议中的原因。好的。总结:使其发挥作用

现在看来一切都很简单。通过确保您的[project folder]/app/build.gradle文件在其dependencies部分中有compile 'com.jakewharton.threetenabp:threetenabp:1.0.3'行,您可以在android项目中获得现代时间处理功能:好的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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'
}

好啊.