如何在Android项目中使用ThreeTenABP

我添加这个问题,因为我是新来的Java和Android,我search了几个小时试图弄清楚。 答案来自于相关答案的组合,所以我想我会logging下我所学习到的任何可能挣扎的人。 见答案。

对于一些背景,我的经验主要是在PHP和一点点的Ruby的Web开发。 我唯一的操作系统是Linux(Ubuntu Studio),我正在(开发)Android Studio 2.1.2中开发我的第一个Android应用程序。 我的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而不是java.time ,ThreeTen Backport甚至Joda-Time

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

最明显的解决scheme是使用内置的java.time ,因为这是处理Java中的时间和date的新标准方法。 它是JSR-310的实现,它是基于Joda-Time库的时间处理新标准提案。

然而, java.time是在Java 8中引入的。安卓到Marshmallow运行在Java 7上(“Android N”是第一个引入Java 8语言特性的版本)。 因此,除非您只针对Android N及以上版本,否则不能依赖于Java 8语言特性(我不确定这是否是100%真实的,但这是我的理解)。 所以java.time已经结束了。

下一个选项可能是Joda-Time,因为JSR-310是基于Joda-Time的。 然而,正如ThreeTenABP自述文件所指出的,出于多种原因,Joda-Time并非最佳select。

接下来是ThreeTen Backport,这是Java 8 java.time包到Java 7的(不完整)backport。这对于大多数用例来说都很好,但是正如ThreeTenABP自述文件中所指出的那样 ,它有Android的性能问题。

所以最后看似正确的select是ThreeTenABP。

第二次发现:构build工具和依赖pipe理

由于编译程序 – 特别是使用一堆外部库的程序 – 非常复杂,Java几乎总是使用“构build工具”来pipe理这个过程。 Make,Apache Ant,Apache Maven和Gradle都是用于Java程序的构build工具(请参阅此文章以进行比较)。 如下所述,Gradle是Android项目的select构build工具。

这些构build工具包括依赖pipe理。 Apache Maven似乎是第一个包含集中式软件包存储库的公司。 Maven介绍了Maven Central Repository ,它允许使用与Packagist和rubygems.org的Ruby的gemfunction。 换句话说,Maven Central Repository是Maven(和Gradle)Packagist的作曲者,它是版本化软件包的权威性和安全性来源。

第三个发现:Gradle在Android项目中处理依赖关系

在我的待办事项列表中最重要的是阅读这里的Gradle文档,包括他们的免费电子书。 如果我在几周前阅读了Android开始学习之后,肯定知道Gradle可以使用Maven Central Repository来pipe理Android项目中的依赖关系。 此外,从StackOverflow的答案中可以看出,从Android Studio 0.8.9开始,Gradle隐式使用Maven Central Repository,这意味着您不必额外configuration设置repo,只需列出依赖关系即可。

第四个发现:项目依赖项列在[project dir] /app/build.gradle中

同样,对于那些在Java中使用Gradle有经验的人也是显而易见的,但是花了我一些时间才弄明白这一点。 如果你看到有人说:“哦,只要加上compile 'this-or-that.jar' ”或类似的东西,就知道compile是build.gradle文件中的一个指令,它指出了编译时间的依赖关系。 这是关于依赖pipe理的官方Gradle页面。

第五个发现:三TenenabP由Jake Wharton而不是ThreeTenpipe理

还有一个问题,我花了太多的时间搞清楚。 如果你在Maven Central寻找ThreeTen,你只能看到threetenbp包,而不是threetenabp 。 如果你进入GitHub回购ThreeTenABP ,你会看到臭名昭着的compile 'this-or-that'线下自述文件的下载部分。

当我第一次打这个github仓库时,我不知道这个汇编代码是什么意思,而是试图在我的terminal上运行它(有一个明显的可预见的失败)。 沮丧的是,直到我把剩下的事情弄清楚之后,我才回过头来,终于意识到,这是一个指向com.jakewharton.threetenabp回购的Maven回购行,而不是org.threeten回购。 这就是为什么我认为ThreeTenABP软件包不在Maven回购软件中。

总结:使其工作

现在这一切似乎很容易。 你可以通过确保你的[project folder]/app/build.gradle文件在它的dependencies部分有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 { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.4.0' compile 'com.android.support:design:23.4.0' compile 'com.jakewharton.threetenabp:threetenabp:1.0.3' }