我问这个问题是因为我是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 Gradle插件4.0.0+获得Java 8+ API终止请求支持
ThreeTenABP库的开发正在逐渐减少。请考虑在接下来的几个月中切换到Android Gradle插件4.0,java.time。*及其核心库终止功能。
要在任何版本的Android平台上启用对这些语言API的支持,请将Android插件更新为4.0.0(或更高版本),并在模块的build.gradle文件中包括以下内容:
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.time软件包,因为这是Java中处理时间和日期的新标准方法。它是JSR 310的实现,它是基于Joda-Time库的时间处理的新标准建议。
但是,java.time是在Java 8中引入的。高达棉花糖的Android在Java 7上运行(“ Android N”是第一个引入Java 8语言功能的版本)。因此,除非您仅针对Android N Nougat及更高版本,否则您不能依赖Java 8语言功能(我不确定这是否100%正确,但这是我的理解)。所以,java.time是的。
下一个选项可能是Joda-Time,因为JSR 310是基于Joda-Time的。但是,正如ThreeTenABP自述文件所指出的,出于多种原因,Joda-Time并不是最佳选择。
接下来是ThreeTen-Backport,它将很多(但不是全部)Java 8java.time功能反向移植到Java7。这对于大多数用例来说都很好,但是,正如ThreeTenABP自述文件所述,它在Android上存在性能问题。
因此,最后一个看似正确的选项是ThreeTenABP。
第二次发现:构建工具和依赖管理
由于编译程序(尤其是使用一堆外部库的程序)非常复杂,因此Java几乎总是使用“构建工具”来管理该过程。Make,Apache Ant,Apache Maven和Gradle都是与Java程序一起使用的构建工具(请参阅本帖子以进行比较)。如后面所述,Gradle是Android项目的首选构建工具。
这些构建工具包括依赖性管理。Apache Maven似乎是第一个包含集中式软件包存储库的仓库。Maven引入了Maven中央存储库,该库允许composer使用与Packagist的php和gemrubygems.org的Ruby等效的功能。换句话说,Maven中央存储库是Maven(和Gradle)对Packagist的构想,它是版本包的权威性和安全性来源。
第三次发现:Gradle处理Android项目中的依赖项
在我的工作清单上最重要的是在这里阅读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。如果您转到ThreeTenABP的github存储库,您将compile ‘this-or-that’在自述文件的“下载”部分看到该臭名昭著的行。
当我第一次访问此github存储库时,我不知道该编译行是什么意思,因此我尝试在终端中运行它(出现明显且可预见的故障)。沮丧的是,直到弄清其余部分后,我才回到很长一段时间,终于意识到这是一条指向com.jakewharton.threetenabp回购协议的Maven回购协议行,而不是org.threeten回购协议。这就是为什么我认为ThreeTenABP软件包不在Maven存储库中。
摘要:使之工作
现在一切似乎都很容易。您可以通过确保[project folder]/app/build.gradle文件中包含implementation ‘com.jakewharton.threetenabp:threetenabp:1.2.1’以下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.2.1'
}
还将其添加到Application类:
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
AndroidThreeTen.init(this);
//...
}
}
安卓技术中台 项目地址:Github、码云 Kotlin 版本:AndroidProject-Kotlin 博客地址:但愿人长久,搬砖不再有 当我们日复一日年复一年的搬砖的时候,你是否曾想过提升一下开发效率,如果一个通用的架构摆在你的面前,你还会选择自己搭架构么,但是搭建出一个好的架构并非易事,有多少人愿意选择去做,还有多少人选择努力去做好,可能寥寥无几,但是你今天看到的,正是你所想要的,一个真正
问题内容: 我想使用Android Studio使用Gradle构建工具开发应用程序。我无法在上插入存储库和库。我的文件如下: 如何在项目中添加OpenCV? 问题答案: 您可以在Android Studio中轻松完成此操作。 请按照以下步骤将Open CV作为库添加到您的项目中。 libraries在项目主目录下创建一个文件夹。例如,如果您的项目是OpenCVExamples,则将创建一个Ope
我想使用Android Studio开发一个应用程序使用Gradle构建工具。我无法在上插入OpenCV repo和库。我的文件如下所示: 我如何在我的项目中添加OpenCV?
问题内容: 我想对英语句子加标签,并进行一些处理。我想使用openNLP。我已经安装了 当我执行命令时 它提供输出POSTagging Text.txt中的输入 我希望它安装正确吗? 现在如何从Java应用程序内部进行此POStagging?我已将openNLPtools,jwnl,maxent jar添加到项目中,但是如何调用POStagging? 问题答案: 这是我放在一起的一些(旧)示例代码
问题内容: 我必须在GWT入口点使用java.util.Calendar,但是在运行应用程序时出现错误,这是因为GWT无法找到源代码,无论如何我都可以解决此问题。 提前致谢!!! 问题答案: java.util.Calendar不是模拟的类。您可以在此处找到仿真类的列表: http://code.google.com/webtoolkit/doc/latest/RefJreEmulation.ht
问题内容: 我正在尝试使用Java中的HtmlUnit登录网站。首先,我输入用户名,然后输入密码。之后,我需要从下拉框中选择一个选项。输入用户名和密码似乎有效,但是当我尝试从下拉框中选择项目时出现错误。谁能帮我解决这个问题?我的代码如下: 问题答案: 这是HTMLunit的单元测试中的代码。 请注意,他们使用的是getSelectsByName而不是getElementById。 这是这些单元测试