首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在安卓项目中使用ThreeTenABP

如何在安卓项目中使用ThreeTenABP
EN

Stack Overflow用户
提问于 2016-08-13 00:36:27
回答 3查看 32.6K关注 0票数 216

我之所以问这个问题,是因为我是Java和Android的新手,我花了几个小时试图弄清楚这一点。答案来自于相关答案的组合,所以我想我应该为其他可能正在努力的人记录下我所学到的东西。请参见答案。

我使用的是Android Studio 2.1.2,我的Java设置如下:

代码语言:javascript
复制
>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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-13 00:36:27

注意:这个答案虽然在技术上是正确的,但现在已经过时了。

现在可以通过Android 8+插件4.0.0+获得Java Gradle API desugaring支持。

(另请参阅Basil Bourque's answer below)

ThreeTenABP Library上的开发正在逐渐结束。请考虑在接下来的几个月里改用Android Gradle plugin 4.0,java.time.*,以及它的核心库去垃圾功能。

要在任何版本的安卓平台上启用对这些语言API的支持,请更新Android plugin to 4.0.0 (or higher)并在模块的build.gradle文件中包含以下内容:

代码语言:javascript
复制
android {
  defaultConfig {
    // Required when setting minSdkVersion to 20 or lower
    multiDexEnabled true
  }

  compileOptions {
    // Flag to enable support for the new language APIs
    coreLibraryDesugaringEnabled true
    // Sets Java compatibility to Java 8
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

dependencies {
  coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.5'
}

原始答案

第一个发现:为什么必须使用ThreeTenABP而不是java.time、ThreeTen-Backport甚至Joda-Time

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

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

但是,Java 8中引入了java.time。Android直到Marshmallow都可以在Java7上运行("Android N“是第一个引入Java8语言特性的版本)。因此,除非您只针对Android N 或更高版本,否则不能依赖Java8语言特性(我不确定这是否百分之百正确,但这是我的理解)。所以java.time出局了。

下一个选项可能是,因为JSR 310是基于Joda-Time的。然而,正如ThreeTenABP readme所指出的,由于许多原因,Joda-Time不是最佳选择。

接下来是,它将大部分(但不是全部)Java8 java.time功能移植到Java7中,这对于大多数用例来说都没问题,但正如ThreeTenABP readme中指出的那样,它在安卓系统上存在性能问题。

因此,最后一个也是看似正确的选择是。

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

由于编译程序--尤其是使用一堆外部库的程序--非常复杂,因此Java几乎总是使用"build tool"来管理这个过程。、、和都是用于Java程序的构建工具(请参阅this post进行比较)。正如下面提到的,Gradle是Android项目的首选构建工具。

这些构建工具包括依赖项管理。Apache Maven似乎是第一个包含集中包存储库的。Maven引入了Maven Central Repository,它的功能等同于php的composer和Ruby的gem的rubygems.org。换句话说,Maven Central Repository之于Maven (和Gradle)就像Packagist之于composer --版本化包的权威且安全的来源。

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

我的首要任务是阅读Gradle文档here,包括他们的免费eBooks。如果我在几周前开始学习Android时阅读了这些内容,我肯定会知道Gradle可以使用Maven Central Repository来管理Android项目中的依赖项。此外,正如在this StackOverflow answer中详细描述的那样,从Android Studio0.8.9开始,Gradle通过Bintray的JCenter隐式使用Maven Central Repository,这意味着您不需要做任何额外的配置来设置存储库--您只需列出依赖项即可。

第四个发现:项目依赖项列在项目目录/app/build.gradle中

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

第五个发现: ThreeTenABP由杰克·沃顿管理,而不是由ThreeTen管理

还有一个我花了太多时间弄清楚的问题。如果您在Maven Central中查找ThreeTen,您将只看到用于threetenbp的包,而不是threetenabp。如果您访问github repo for ThreeTenABP,您将在自述文件的Download部分下看到臭名昭著的compile 'this-or-that'行。

当我第一次访问这个github代码库时,我不知道编译行是什么意思,我尝试在我的终端中运行它(有一个明显的和可预见的失败)。令人沮丧的是,直到我弄清楚其余部分后很久,我才返回到它,并最终意识到这是一个指向com.jakewharton.threetenabp存储库的Maven repo行,而不是org.threeten存储库。这就是为什么我认为ThreeTenABP包不在Maven中的原因。

摘要:让它正常工作

现在,这一切似乎都很容易。通过确保[project folder]/app/build.gradle文件的dependencies部分包含implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'行,您可以在安卓项目中获得现代时间处理函数:

代码语言:javascript
复制
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类中:

代码语言:javascript
复制
public class App extends Application {    
    @Override
    public void onCreate() {
        super.onCreate();
        AndroidThreeTen.init(this);
        //...
    }
}
票数 215
EN

Stack Overflow用户

发布于 2020-05-05 08:35:59

接受的Answer by kael是正确的。此外,我还会提到一些事情,并提供一个关于获取java.time功能的图表。

内置于安卓26+的java.time

如果以Android 26或更高版本为目标,您会发现与Android捆绑在一起的JSR 310 (java.time类)实现。不需要添加ThreeTenABP。

API几乎完全相同

为了澄清,用于安卓的是对库的改编,它将大部分java.time功能带到了Java 6Java 7上。此后端口与java.time共享几乎相同的API。

假设你现在的目标是安卓26之前的版本,所以你使用ThreeTenABP。稍后,您可能最终会放弃对这些早期版本安卓的支持,转而使用与安卓捆绑在一起的java.time类。当发生这种情况时,除了(a)切换import语句和(b)更改对org.threeten.bp.DateTimeUtils的任何调用以使用添加到旧的遗留日期-时间类(DateGregorianCalendar)中的新转换方法之外,您只需要对代码库进行少量更改。

从ThreeTenABP到java.time的过渡过程应该是平稳的,几乎不会有任何痛苦。

何时使用哪个框架

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

Gradle更新:安卓➥插件4.0.0+带来了一个新的第四个选项,API desugaring,以提供一个最初没有内置到早期安卓中的subset of functionality。请看main Answer by kael的顶部。

关于java.time

框架内置于Java8和更高版本中。这些类取代了麻烦的旧legacy日期时间类,如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参阅。和搜索堆栈溢出,以获得许多示例和解释。规范为JSR 310

现在在maintenance mode中的项目建议迁移到java.time类。

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

从哪里获取java.time类?

  • ,、、和更高版本-标准Java API的一部分,具有捆绑的实现。
    • 带来了一些次要的特性和fixes.

  • 和.

中的

  • 大多数java.time功能已向后移植到Java6和7

    • 更高版本的Android (26+)捆绑了java.time类的实现。
    • 对于较早的Android (<26),的进程带来了最初没有内置到Android中的subset of the 功能。
      • 如果去糖化没有提供你需要的东西,项目会让 (上面提到的)适应安卓系统。请参阅.
票数 12
EN

Stack Overflow用户

发布于 2019-08-19 01:02:59

在Android Studio的build gradle (模块级)文件中添加以下内容:

代码语言:javascript
复制
implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'

创建应用程序类并初始化它,如下所示:

代码语言:javascript
复制
class App : Application() {
    override fun onCreate() {
        super.onCreate()
        AndroidThreeTen.init(this)
    }
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38922754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档