私は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)
これは、新しい標準を定義する非常に長いプロセスの本当に短いバージョンです。これらのパッケージはすべて、ほぼ同じものです。Javaの優れた最新の時間処理機能を提供するライブラリです。違いはわずかですが、重要です。
最も明白な解決策は、組み込みの Java.time
パッケージを使用することです。これはJavaで時刻と日付を処理する新しい標準的な方法であるためです。これは JSR 310 の実装です。 Joda-Time ライブラリに基づく時間処理の新しい標準提案。
ただし、Java.time
は Java8 で導入されました。Androidまで Marshmallow で実行されますJava7( "Android N"はJava8言語機能を導入する最初のバージョン)。したがって、 AndroidN Nougat 以上をターゲットにしている場合を除き、 Java8言語機能に依存しています(実際、これが100%真実かどうかはわかりませんが、これは私が理解している方法です)。したがって、Java.time
は出ています。
次のオプションは、 JSR 310 はJoda-Timeに基づいていたため、 Joda-Time になります。ただし、 ThreeTenABP readme が示すように、多くの理由により、Joda-Timeは最適なオプションではありません。
次は ThreeTen-Backport です。これはJava8 Java.time
機能の多く(すべてではない)をJava7.にバックポートします。ほとんどのユースケースで問題ありませんが、 ThreeTenABP readme に示されているように、Androidでパフォーマンスの問題があります。
したがって、最後の、一見正しいオプションは ThreeTenABP です。
プログラム(特に外部ライブラリの束を使用するもの)のコンパイルは複雑であるため、Javaはほとんど常に "ビルドツール" を使用してプロセスを管理します。 Make 、 Apache Ant 、 Apache Maven 、および Gradle はすべて使用されるビルドツールです。 Javaプログラム(比較については この投稿 を参照してください。)さらに後述するように、GradleはAndroidプロジェクト用に選択されたビルドツールです。
これらのビルドツールには、依存関係管理が含まれます。 Apache Mavenは、集中パッケージリポジトリを含む最初の製品のようです。 Mavenは Maven Central Repository を導入しました。これにより、Packagistでphpのcomposer
およびrubygems.orgでRubyのgem
と同等の機能が可能になります。つまり、Maven Central RepositoryはMaven )Packagistの目的composer-バージョン管理されたパッケージの決定的で安全なソース。
To Doリストの上位は、Gradleのドキュメント こちら 、無料の電子書籍を含む)を読むことです。この数週間前にAndroidの学習を始めたときに、GradleがMaven Central Repositoryを使用して、 Androidプロジェクトの依存関係を管理します。さらに、 this StackOverflow answerで詳しく説明されているように、AndroidStudio 0.8.9以降、GradleはBintrayのJCenterを介してMaven Central Repositoryを暗黙的に使用します。リポジトリを設定するために追加の設定を行う必要はありません。依存関係をリストするだけです。
繰り返しになりますが、JavaでGradleを使用した経験がある人には明らかですが、これを理解するのに時間がかかりました。 「ああ、compile 'this-or-that.jar'
を追加してください」などと言っている人がいる場合は、compile
がbuild.gradleファイル内のコンパイル時の依存関係を示すディレクティブであることを知ってください。 依存関係管理に関する公式のGradleページ。
さらに別の問題を考え出すのに時間がかかりすぎました。 Maven CentralでThreeTenを探すと、threetenbp
ではなくthreetenabp
のパッケージのみが表示されます。 ThreeTenABPの githubリポジトリ にアクセスすると、Readmeの[ダウンロード]セクションの下にその悪名高いcompile 'this-or-that'
行が表示されます。
このgithubリポジトリに初めてアクセスしたとき、そのコンパイル行の意味がわからず、ターミナルで実行しようとしました(明らかで予測可能な障害が発生しました)。イライラして、残りの部分を考え出してからしばらく経ってから、com.jakewharton.threetenabp
リポジトリではなく、org.threeten
リポジトリを指すMavenリポジトリ行であることに気付きました。だからこそ、私はThreeTenABPパッケージがMavenリポジトリにないと思ったのです。
今ではすべてがとても簡単に思えます。 [project folder]/app/build.gradle
ファイルのdependencies
セクションにcompile 'com.jakewharton.threetenabp:threetenabp:1.0.3'
行が含まれていることを確認することにより、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);
//...
}
}
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);
}
}