web-dev-qa-db-ja.com

Three_TenABPをAndroidプロジェクトで使用する方法

私はJavaとAndroidが初めてで、これを理解しようとして何時間も検索したため、この質問をしています。答えは関連する答えの組み合わせから来たので、苦労しているかもしれない他の人のために私が学んだことを文書化すると考えました。答えをご覧ください。

Android St​​udio 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)
156
kael

最初の発見:Java.timeThreeTen-Backport、またはJoda-Timeの代わりにThreeTenABPを使用する必要がある理由

これは、新しい標準を定義する非常に長いプロセスの本当に短いバージョンです。これらのパッケージはすべて、ほぼ同じものです。Javaの優れた最新の時間処理機能を提供するライブラリです。違いはわずかですが、重要です。

最も明白な解決策は、組み込みの Java.time パッケージを使用することです。これはJavaで時刻と日付を処理する新しい標準的な方法であるためです。これは JSR 310 の実装です。 Joda-Time ライブラリに基づく時間処理の新しい標準提案。

ただし、Java.timeJava8 で導入されました。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 です。

Second Discovery:ビルドツールと依存関係管理

プログラム(特に外部ライブラリの束を使用するもの)のコンパイルは複雑であるため、Javaはほとんど常に "ビルドツール" を使用してプロセスを管理します。 MakeApache AntApache Maven 、および Gradle はすべて使用されるビルドツールです。 Javaプログラム(比較については この投稿 を参照してください。)さらに後述するように、GradleはAndroidプロジェクト用に選択されたビルドツールです。

これらのビルドツールには、依存関係管理が含まれます。 Apache Mavenは、集中パッケージリポジトリを含む最初の製品のようです。 Mavenは Maven Central Repository を導入しました。これにより、Packagistでphpのcomposerおよびrubygems.orgでRubyのgemと同等の機能が可能になります。つまり、Maven Central RepositoryはMaven )Packagistの目的composer-バージョン管理されたパッケージの決定的で安全なソース。

3番目の発見:GradleはAndroidプロジェクトの依存関係を処理します

To Doリストの上位は、Gradleのドキュメント こちら 、無料の電子書籍を含む)を読むことです。この数週間前にAndroidの学習を始めたときに、GradleがMaven Central Repositoryを使用して、 Androidプロジェクトの依存関係を管理します。さらに、 this StackOverflow answerで詳しく説明されているように、AndroidStudio 0.8.9以降、GradleはBintrayのJCenterを介してMaven Central Repositoryを暗黙的に使用します。リポジトリを設定するために追加の設定を行う必要はありません。依存関係をリストするだけです。

4番目の発見:プロジェクトの依存関係が[project dir] /app/build.gradleにリストされています

繰り返しになりますが、JavaでGradleを使用した経験がある人には明らかですが、これを理解するのに時間がかかりました。 「ああ、compile 'this-or-that.jar'を追加してください」などと言っている人がいる場合は、compileがbuild.gradleファイル内のコンパイル時の依存関係を示すディレクティブであることを知ってください。 依存関係管理に関する公式のGradleページ。

5番目の発見:ThreeTenABPはThreeTenではなくJake Whartonが管理しています

さらに別の問題を考え出すのに時間がかかりすぎました。 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);
        //...
    }
}
144
kael

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);
    }
}
0
Richard Kamere