如何在Android Project中使用ThreeTenABP

时间:2016-08-12 16:36:27

标签: android android-gradle

我问这个问题,因为我是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)

3 个答案:

答案 0 :(得分:134)

首次发现:为什么必须使用 ThreeTenABP 而不是 java.time ThreeTen-Backport ,甚至 Joda-时间

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

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

但是,Java 8中引入了java.time。最高Marshmallow的Android在Java 7上运行(“Android N”是第一个引入Java 8语言功能的版本)。因此,除非您只针对Android N Nougat及更高版本,否则您不能依赖Java 8语言功能(我实际上并不确定这是100%正确,但这是我理解它的方式)。所以java.time已经出局了。

下一个选项可能是Joda-Time,因为JSR 310基于Joda-Time。但是,正如ThreeTenABP readme所示,由于多种原因,Joda-Time不是最佳选择。

接下来是ThreeTen-Backport,它将Java 8 java.time功能的大部分(但不是全部)反向移植到Java 7.这适用于大多数用例,但是,如{ {3}},它在Android上存在性能问题。

所以最后一个看似正确的选项是ThreeTenABP readme

第二次发现:构建工具和依赖关系管理

由于编译程序 - 特别是使用一堆外部库的程序 - 很复杂,因此Java几乎总是使用ThreeTenABP来管理进程。 "build tool"MakeApache AntApache Maven都是与Java程序一起使用的构建工具(请参阅Gradle进行比较)。如下所述,Gradle是Android项目的选择构建工具。

这些构建工具包括依赖关系管理。 Apache Maven似乎是第一个包含集中式软件包存储库的人。 Maven引入了this post,它允许功能等同于带有Packagist的php composer和带有rubygems.org的Ruby gem。换句话说,Maven Central Repository是Maven(和Gradle)Packagist的作曲家 - 一个版权化软件包的权威和安全来源。

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

我的待办事项列表中的高点是阅读Gradle文档Maven Central Repository,包括他们的免费电子书。如果我几周前开始学习Android时读过这篇文章,我肯定知道Gradle可以使用Maven Central Repository来管理Android项目中的依赖项。此外,详见here StackOverflow答案,从Android Studio 0.8.9开始,Gradle通过Bintray的JCenter隐式使用Maven Central Repository,这意味着您无需进行任何额外的配置来设置repo - 你只需列出依赖项。

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

同样,对于那些在Java中使用Gradle有经验的人来说显而易见,但我花了一些时间才弄明白这一点。如果你看到有人说“哦,只需添加compile 'this-or-that.jar'”或类似内容,请知道compile是该build.gradle文件中的一个指示编译时依赖项的指令。 this关于依赖管理的官方Gradle页面。

第五次发现:ThreeTenABP由Jake Wharton管理,而不是由ThreeTen管理

另一个问题我花了太多时间搞清楚。如果你在Maven Central中寻找ThreeTen,你只会看到threetenbp的包,而不是threetenabp。如果您转到Here's,您会在自述文件的下载部分下看到臭名昭着的compile 'this-or-that'行。

当我第一次点击这个github repo时,我不知道编译行是什么意思,我试图在我的终端中运行它(具有明显且可预测的失败)。很沮丧,直到我想出其余部分之后我都没有回到它,最后意识到它是指向com.jakewharton.threetenabp仓库的Maven Repo线,而不是org.threeten仓库。这就是为什么我认为ThreeTenABP包不在Maven回购中。

总结:让它发挥作用

现在看起来很简单。您可以通过确保[project folder]/app/build.gradle文件的compile 'com.jakewharton.threetenabp:threetenabp:1.0.3'部分中包含dependencies行来获取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'
}

答案 1 :(得分:8)

接受的Answer by kael是正确的。另外,我将提到几件事,并提供一个有关获取 java.time 功能的图表。

java.time 内置于Android 26 +

如果定位到Android 26或更高版本,您将发现与Android捆绑在一起的JSR 310 java.time 类)的实现。无需添加 ThreeTenABP

API几乎完全相同

仅需说明一下,Android的ThreeTenABPThreeTen-Backport库的改编版,它将大多数 java.time 功能引入了Java 6和{{ 3}}。此后端口与 java.time 共享几乎相同的API。

假设您现在定位的Android版本早于26,因此您使用 ThreeTenABP 。稍后,您最终可能会放弃对这些早期版本的Android的支持,以使用与Android捆绑在一起的 java.time 类。发生这种情况时,除了(a)切换import语句,以及(b)更改对Java 7的任何调用以使用添加到其中的新转换方法之外,您几乎不需要更改代码库旧的旧式日期时间类(DateGregorianCalendar)。

ThreeTenABP java.time 的过渡过程应该平稳且几乎没有痛苦。

何时使用哪种框架

这是一个图表,显示了这三个框架,并指出了在哪种情况下何时使用哪个框架。

➥更新::Android Gradle插件4.0.0+带来了一个新的第4个选项org.threeten.bp.DateTimeUtils,以提供最初并非内置于较早的Android中的API desugaring。参见kael的subset of java.time functionality顶部。

main Answer


关于 java.time

Table of which java.time library to use with which version of Java or Android框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧java.time日期时间类,例如legacyjava.util.DateCalendar

要了解更多信息,请参阅SimpleDateFormat。并在Stack Overflow中搜索许多示例和说明。规范为Oracle Tutorial

JSR 310项目(现在位于Joda-Time中)建议迁移到maintenance mode类。

您可以直接与数据库交换 java.time 对象。使用符合java.time或更高版本的JDBC driver。不需要字符串,不需要java.sql.*类。 Hibernate 5和JPA 2.2支持 java.time

在哪里获取java.time类?

答案 2 :(得分:0)

在gradle文件中添加以下内容。

/* android back port for java time  */
implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'

创建Application类并对其进行初始化。

public class App extends Application {    
    @Override
    public void onCreate() {
        super.onCreate();
       AndroidThreeTen.init(this);
    }
}