我之所以问这个问题,是因为我对Java和Android还不熟悉,我花了好几个小时想弄清楚这个问题。答案来自相关答案的组合,所以我想我会把我学到的东西记录下来,给其他正在挣扎的人。参见答案。
我使用的是Android Studio2.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)
(另见下文巴兹尔·布尔克的回答)
ThreeTenABP库的开发正在逐步结束。请考虑在未来几个月内切换到Android Gradle Plugin4.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'
}
这是定义一个新标准的非常长的过程的一个非常短的版本。所有这些包基本上都是一样的:为Java提供良好的现代处理功能的库。这些差别很细微,但很重要。
最明显的解决方案是使用内置的Java.time
包,因为这是处理Java中时间和日期的新标准方法。它是JSR310的实现,JSR310是一个基于Joda-Time库的新的时间处理标准提案。
但是,Java.time
是在Java 8中引入的。直到棉花糖的Android运行在Java 7上(“Android N”是第一个引入Java 8语言特性的版本)。因此,除非你只针对Android N牛轧糖及以上版本,否则你不能依赖Java 8的语言特性(实际上我不确定这是100%正确的,但我就是这么理解的)。因此java.time
已退出。
下一个选项可能是Joda-Time,因为JSR310是基于Joda-Time的。但是,正如ThreeTenABP自述文件所指出的,由于许多原因,Joda-Time不是最佳选择。
接下来是ThreeTen-Backport,它将Java 8Java.time
的大部分(但不是全部)功能后端到Java 7。这对于大多数用例来说是很好的,但是,正如ThreeTenABP自述文件中所指出的,它在Android中存在性能问题。
所以最后一个看起来也是正确的选项是threetenabp。
由于编译一个程序--尤其是一个使用一堆外部库的程序--是复杂的,Java几乎总是使用一个“构建工具”来管理这个过程。Make、Apache Ant、Apache Maven和Gradle都是与Java程序一起使用的构建工具(参见本文的比较)。如下文所述,Gradle是Android项目所选择的构建工具。
这些构建工具包括依赖关系管理。Apache Maven似乎是第一个包含集中的包存储库的。Maven引入了Maven Central Repository,它允许与PHP的composer
和RubyGems.org的gem
等价的功能。换句话说,Maven Central Repository对于Maven(和Gradle)来说就像Packagist对于composer一样--一个版本化包的明确和安全的源。
在我的待办事项清单上,最重要的是阅读这里的Gradle文档,包括他们的免费电子书。如果我在几周前开始学习Android时读过,我肯定会知道Gradle可以使用Maven Central Repository来管理Android项目中的依赖项。此外,正如本StackOverflow答案中详细介绍的那样,从Android Studio 0.8.9开始,Gradle通过Bintray的JCenter隐式地使用Maven中央存储库,这意味着您不必进行任何额外的配置来设置回购--只需列出依赖项。
同样,对于那些有在Java使用Gradle经验的人来说,这是显而易见的,但我花了一段时间才弄明白这一点。如果您看到人们说“哦,只需添加compile'this-or-that.jar'
”或类似的内容,请知道compile
是build.gradle文件中指示编译时依赖关系的指令。这是关于依赖管理的官方分级页面。
还有一个问题我花了太多时间去想。如果您在Maven Central中查找ThreeTen,您将只看到threetenbp
的包,而不是threetenabp
。如果您转到github repo for ThreeTenABP,您会看到自述文件的下载部分下的臭名昭著的compile'this-or-that'
行。
当我第一次使用这个github repo时,我不知道编译行是什么意思,我试图在我的终端中运行它(有一个明显的、可预测的失败)。我很沮丧,直到我想清楚了剩下的部分后很久才回到它,并最终意识到这是一个Maven Repo行指向com.jakewharton.threetenabp
Repo,而不是org.threeten
Repo。这就是为什么我认为ThreeTenABP包不在Maven回购中的原因。
现在一切似乎都很简单。通过确保[project folder]/app/build.gradle
文件的dependencies
部分中有implementation'com.jakewharton.threetenabp:threetenabp:1.2.1“
行,您可以在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);
//...
}
}
虽然我在构建中集成了库。但当我在设备上运行它时,会发生以下错误。 我的代码是这样的,buidl。格拉德尔 我正在使用Lucence的类 模范班 这一切从哪里开始 }
我是Kotlin的新手,正在尝试使用coroutine学习异步编程。我在跟踪Kotlin的官方文件。但是当我试图编译代码时,它显示了错误:“未解析的引用:Kotlinx”。所以我只想知道,如何在非android项目中使用Coroutine? 我正在用Ubuntu终端编译代码。 代码段
问题内容: 我了解Singleton,但无法在Android项目中使用它。我是Android的初学者。请告诉我如何在Android项目中将Singleton用于大数据。我已将其用于简单值。 问题答案: Android中的Singleton与Java中的Singleton相同: 一个基本的Singleton类示例:
我想在我的应用程序中实现autolinktextview。github中有一个库,现在我想在我的应用程序中使用,但库语言是kotlin,我的应用程序项目语言是java。下面给出的库Url和我使用的依赖项。 https://github.com/armcha/AutoLinkTextViewV2