如何在Android项目中使用ThreeTenABP

2023-11-27

我使用的是 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)

I searched for hours trying to figure this out. The answer came from a combination of related answers, so I figured I would document what I learned for anyone else who may be struggling. See answer.


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

Java 8+ API 脱糖支持现已通过 Android Gradle 插件 4.0.0+ 提供

(另请参阅Basil Bourque 的回答如下)

发展于ThreeTenABP 库正在结束。请考虑在未来几个月内切换到 Android Gradle 插件 4.0、java.time.* 及其核心库脱糖功能。

要在任何版本的 Android 平台上启用对这些语言 API 的支持,请将 Android 插件更新到 4.0.0(或更高版本),并在模块的 build.gradle 文件中包含以下内容(来自Android 开发者网站上 Java 8 支持页面的这一部分,其中还有有关脱糖的附加信息):

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

原答案

第一个发现:为什么你必须使用三十ABP代替java.time, 三十后端口, 甚至乔达时间

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

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

然而,java.time被介绍于Java 8。安卓高达棉花糖在 Java 7 上运行(“Android N”是第一个引入 Java 8 语言功能的版本)。因此,除非你的目标只是安卓NNougat及以上,你不能依赖 Java 8 语言功能(我实际上不确定这是否 100% 正确,但这就是我的理解)。所以java.time is out.

下一个选择可能是乔达时间, since JSR 310基于 Joda-Time。然而,作为ThreeTenABP 自述文件表明,出于多种原因,Joda-Time 不是最佳选择。

Next is 三十后端口,向后移植了 Java 8 的大部分(但不是全部)java.timeJava 7 的功能。这对于大多数用例来说都很好,但是,如ThreeTenABP 自述文件,它与 Android 存在性能问题。

所以最后一个看似正确的选项是三十ABP.

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

由于编译程序(尤其是使用一堆外部库的程序)很复杂,因此 Java 几乎总是使用“构建工具”来管理流程。Make, 阿帕奇蚂蚁, 阿帕奇Maven, and Gradle都是与 Java 程序一起使用的构建工具(请参阅这个帖子用于比较)。正如下文所述,Gradle 是 Android 项目选择的构建工具。

这些构建工具包括依赖管理。 Apache Maven 似乎是第一个包含集中式包存储库的。 Maven 介绍了Maven 中央存储库,它允许与 php 等效的功能composer与 Packagist 和 Ruby 合作gem与 ruby​​gems.org。换句话说,Maven 中央存储库之于 Maven(和 Gradle)就像 Packagist 之于 Composer —— 版本化包的明确且安全的来源。

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

我的待办事项清单中最重要的是阅读 Gradle 文档here,包括他们的免费电子书。如果我几周前开始学习 Android 时读过这些内容,我肯定会知道 Gradle 可以使用 Maven 中央存储库来管理 Android 项目中的依赖项。此外,正如详细介绍的thisStackOverflow 的回答是,从 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 文件中的一个指令,指示编译时依赖项。Here's有关依赖管理的官方 Gradle 页面。

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

还有一个问题我花了太多时间来解决。如果您在 Maven Central 中查找 ThreeTen,您只会看到以下包threetenbp, not threetenabp。如果你去ThreeTenABP 的 github 存储库,你会看到那个臭名昭著的compile 'this-or-that'自述文件下载部分下的行。

当我第一次访问这个 github 存储库时,我不知道该编译行意味着什么,我尝试在我的终端中运行它(出现明显且可预测的失败)。沮丧的是,我直到弄清楚其余部分很久之后才返回它,并最终意识到这是一条指向 Maven Repo 的行com.jakewharton.threetenabp回购协议,而不是org.threeten回购。这就是为什么我认为 Maven 存储库中没有 ThreeTenABP 包。

摘要:让它发挥作用

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

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);
        //...
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Android项目中使用ThreeTenABP 的相关文章

  • 我在布局上看不到任何 FirebaseRecyclerAdapter 项目

    我试图将数据从 Firebase 数据库检索到我的布局 但我看不到任何项目FirebaseRecyclerAdapter在布局中 请帮忙 我按照一个教程展示了如何做到这一点 当我运行应用程序时 我没有看到任何项目 但我可以滚动 public
  • Android短音的正确播放方法?

    我正在创建一个应用程序 屏幕上将有多个图像 这些图像将是按钮 点击时会播放短促的声音 我对此进行了研究 只能找到我当前用来播放声音的方法 这似乎根本没有响应 我希望声音能够快速播放并且能够响应多次快速点击 我不确定这在 Android 中是
  • Gradle 构建错误:无法从 https://repo1.maven.org/maven2/io/fabric/tools/gradle/maven-metadata.xml 加载 Maven 元数据

    我在 Android studio 中遇到 gradle 构建错误 如下所示 Error A problem occurred configuring project MyApp Could not resolve all dependen
  • Recyclerview 动态部分不使用任何第三个库

    我想将标头添加到 recyclerview 我正在尝试使用来实现它 Override public int getItemViewType int position depends on your problem if position 0
  • Android WebView里面的ScrollView只滚动scrollview

    在我的应用程序中 我有一个 ScrollView 其中包含一些线性视图 一些文本视图和一个 Webview 然后是其他线性布局等 问题是 WebView 不滚动 Scroll 仅侦听 ScrollView 有什么建议么
  • 如何计算 pandas datetime 对象的均值和方差?

    如何计算 YYYY MM DD 形式的 python 日期时间对象的汇总统计数据 均值和标准差 我想对具有不同 ID 的不同日期时间对象组执行此操作 数据如下 import datetime as dt df pd DataFrame Da
  • 在 Cordova 应用程序中获取额外功能

    我们有两个 Android 应用程序 一个使用本机 Java 实现 另一个使用 Ionic 编写 Ionic 应用程序启动我的应用程序 这是使用灯插件 https github com lampaa com lampa startapp 我
  • ExoPlayer2 - 如何使 HTTP 301 重定向工作?

    我开始使用 ExoPlayer 来传输一些音频 一切都很顺利 直到我遇到一个带有 301 永久移动 重定向的 URL ExoPlayer2 默认情况下不处理该问题 我已经看过这个线程 https github com google ExoP
  • Android Eclipse 上的 Web 服务

    我是 android eclipse java 的新手 事实上这个论坛也是如此 有人遇到过这种情况吗 从用户那里获取输入并通过使用 android eclipse 中的 Web 服务来显示适当的结果 有可用的示例吗 非常感谢 我正在发布教程
  • 当 OnFocusChangeListener 应用于包装的 EditText 时,TextInputLayout 没有动画

    不能比标题说得更清楚了 我有一个由文本输入布局包裹的 EditText 我试图在 EditText 失去焦点时触发一个事件 但是 一旦应用了事件侦听器 TextInputLayout 就不再对文本进行动画处理 它只是位于 editText
  • 图像作为电子邮件附件

    我想构建一个应用程序 我可以在电子邮件中附加图像 打开图像并将其设置为我的壁纸 我想让它跨平台 所以你能告诉我是否可以使用phonegap 或者我是否必须为iphone和android构建一个本机应用程序 您好 如果您只想通过电子邮件附加图
  • 使用片段时应用程序崩溃

    我正在处理碎片和 我的代码中有一个我找不到的问题 logcat 指向我的一个片段中的这段代码 Override public View onCreateView LayoutInflater inflater ViewGroup conta
  • okhttp 获取失败响应

    我已经在我的 android 客户端中实现了 okhttp 来进行网络调用 当我收到失败响应时 我会收到失败代码以及与该代码相关的文本作为消息 但我没有收到服务器发送给我的自定义失败响应 在我实施的代码中的失败响应中 我收到的消息只是 错误
  • OnLongClickListener 不工作

    我有一个ImageView 我需要使用onLongClickListener对于图像视图 当我使用这段代码时 什么也没有发生 Code gallery Gallery findViewById R id gall1 gallery setA
  • Android 如何将总天数准确更改为年、月、日?

    我正在做一个应用程序 该应用程序与根据给定的生日日期输入获取一个人的年龄有关 为此 我从下面的代码中获取从该日期到当前日期的总天数 String strThatDay 1991 05 10 SimpleDateFormat formatte
  • 在命令行上卸载 Android SDK 的选定部分

    这与 卸载旧的 Android SDK 版本 https stackoverflow com questions 15182377 uninstall old android sdk versions 除非我想在无头 Linux CI 服务
  • 插件“Android Bundle Support”不兼容

    大家好 自从上次更新以来 当我启动 android studio 时 我遇到了一个非常奇怪的错误 我有这个错误 插件错误 插件 Android Bundle Support 不兼容 直到构建 AI 195 SNAPSHOT 我在网上找不到任
  • 问题:为什么React Native Video不能全屏播放视频?

    我正在react native 0 57 7 中为android和ios创建一个应用程序并使用反应本机视频 https github com react native community react native video播放上传到的视频
  • 错误:(23, 13) 无法解决:com.google.android.gms:play-services:11.2.0“安装存储库和同步项目”不起作用

    我正在尝试在我的 Android 应用程序中获取位置并更新到服务器 这是我的 Gradle 代码 我在这里包含了compile com google android gms play services 11 2 0 这条线是从文档中 htt
  • Android 后台倒计时器

    我有一个 Android 应用程序 它管理一个倒计时器 类 CountDownTimer 它显示在应用程序屏幕中 以显示到达 00 00 还剩多少时间 我现在的问题是 当我按主页按钮或启动另一个应用程序时 应用程序 计时器不会在后台运行 所

随机推荐