问题:如何在Android Project中使用ThreeTenABP

我之所以问这个问题,是因为我是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)
标签:android,datetime,android-gradle-plugin,threetenbp,threetenabp

回答1:

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

这是定义新标准的非常漫长的过程的简短版本。所有这些软件包几乎都是相同的:库为Java提供了良好的现代时间处理功能。差异微妙但重要。

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

但是, Java 8 中引入了java.time >。最多棉花糖的Android在Java 7上运行(" Android N"是第一个引入Java 8的版本语言功能)。因此,除非您仅定位到 Android N 牛轧糖 及更高版本,您不能依赖Java 8语言功能(实际上我不确定这是100%正确,但这就是我的理解)。所以java.time都没了。

下一个选项可能是 Joda-Time ,因为 JSR 310 基于Joda-Time。但是,由于多种原因, ThreeTenABP自述文件指出了乔达-时间不是最好的选择。

下一个是 ThreeTen-Backport ,它可以向后移植很多( (但不是全部)Java 7的Java 8 java.time功能。这对于大多数用例都很好,但是,如 ThreeTenABP自述文件,它在Android上存在性能问题。

因此,最后一个看似正确的选项是 ThreeTenABP

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

由于编译程序(尤其是使用一堆外部库的程序)非常复杂,因此Java几乎总是使用"构建工具" 来管理该过程。 制造 Apache Ant Apache Maven Gradle < / em> 是与Java程序一起使用的所有构建工具(请参见此发布进行比较)。如后面所述,Gradle是Android项目的首选构建工具。

这些构建工具包括依赖项管理。 Apache Maven似乎是第一个包含集中式软件包存储库的仓库。 Maven引入了 Maven Central Repository ,它允许与Packagist和PHP的composer等效的功能。 Ruby的gem和rubygems.org。换句话说,Maven中央存储库是Maven(和Gradle)组成Packagist的工具,而后者是确定版本的软件包的安全可靠来源。

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

我的待办事项上的重点是在此处上阅读Gradle文档,包括其文档免费电子书。如果我在这几周前开始学习Android时就读过这篇文章,那么我肯定会知道Gradle可以使用Maven Central信息库来管理Android项目中的依赖项。此外,如 StackOverflow答案中所述,从Android Studio 0.8.9开始,Gradle通过Bintray的JCenter隐式使用Maven Central Repository ,这意味着您无需执行任何其他配置即可设置存储库-您只需列出依赖项即可。

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

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

第五发现:ThreeTenABP由杰克·沃顿(Jake Wharton)管理,而不是由ThreeTen管理

还有另一个问题,我花了太多时间弄清楚。如果您在Maven Central中寻找ThreeTen,则只会看到threetenbp的软件包,而不是threetenabp的软件包。如果您转到ThreeaTenABP的 github存储库,则会看到臭名昭著的compile'this-"自述文件"的"下载"部分下的"-"或" "行。

当我第一次访问这个github仓库时,我不知道该编译行是什么意思,所以我试图在终端中运行它(出现了明显且可预见的故障)。沮丧的是,直到我弄清其余部分后,我才回到很长的距离,最后才意识到这是一条指向com.jakewharton.threetenabp repo的Maven Repo行,而不是> org.threeten 回购。这就是为什么我认为ThreeTenABP软件包不在Maven存储库中。

摘要:使其正常运行

现在,一切似乎都很容易。通过确保您的[项目文件夹]/app/build.gradle文件具有实现'com.jakewharton.threetenabp:threetenabp:1.2,您可以在Android项目中获得现代时间处理功能.dependencies部分中的1'行:

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.2.1'
}

也将此添加到Application类:

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

回答2:

在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);
    }
}
回到顶部