218

私は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)
4

3 に答える 3

218

注意:この回答は技術的には正しいですが、現在は古くなっています

Android Gradle Plugin 4.0.0+ を介して、Java 8+ API desugar のサポートが利用可能になりました

(以下の Basil Bourque の回答も参照してください)

ThreeTenABP ライブラリの開発は終了しています。今後数か月以内に、Android Gradle プラグイン 4.0、java.time.*、およびそのコア ライブラリの desugar 機能への切り替えを検討してください。

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.timeThreeTen-Backport、またはJoda- Timeの代わりにThreeTenABPを使用する必要がある理由

これは、新しい標準を定義する非常に長いプロセスの非常に短いバージョンです。これらのパッケージはすべて、ほとんど同じものです。つまり、Java の優れた最新の処理機能を提供するライブラリーです。違いは微妙ですが重要です。

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

ただし、Java 8java.timeで導入されました。MarshmallowまでのAndroidは Java 7 で動作します (「Android N」は、Java 8 言語機能を導入した最初のバージョンです)。したがって、 Android N Nougat以降のみをターゲットにしている場合を除き、Java 8 言語機能に依存することはできません (これが 100% 正しいかどうかは実際にはわかりませんが、これが私が理解している方法です)。アウトです。java.time

JSR 310は Joda-Time に基づいていたため、次の選択肢はJoda-Timeかもしれません。ただし、ThreeTenABP の readmeが示すように、多くの理由から、Joda-Time は最適なオプションではありません。

次はThreeTen-Backportで、Java 8 のjava.time機能の多く (すべてではない) を Java 7 にバックポートします。これはほとんどのユースケースで問題ありませんが、ThreeTenABP の readmeに示されているように、Android ではパフォーマンスの問題があります。

したがって、最後の一見正しいオプションはThreeTenABPです。

2 つ目の発見: ビルド ツールと依存関係の管理

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

これらのビルド ツールには、依存関係管理が含まれています。Apache Maven は、一元化されたパッケージ リポジトリを最初に組み込んだようです。Maven はMaven Central Repositoryを導入しました。これにより、Packagist を使用した phpcomposerおよび ruby​​gems.org を使用した Ruby と同等の機能が可能になりますgem。言い換えれば、Maven (および Gradle) にとっての Maven セントラル リポジトリは、Composer にとっての Packagist と同じものであり、バージョン管理されたパッケージの決定的で安全なソースです。

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

私のやることリストの上位にあるのは、無料の電子ブックを含むここの Gradle ドキュメントを読むことです。Android を学び始めた数週間前にこの記事を読んでいれば、Gradle が Maven セントラル リポジトリを使用して Android プロジェクトの依存関係を管理できることを知っていたでしょう。さらに、このStackOverflow の回答で詳しく説明されているように、Android Studio 0.8.9 の時点で、Gradle は Bintray の JCenter を介して暗黙的に Maven セントラル リポジトリを使用します。つまり、リポジトリをセットアップするために追加の構成を行う必要はありません。依存関係。

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

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

第 5 の発見: ThreeTenABP は ThreeTen ではなく Jake Wharton によって管理されています

私が理解するのにあまりにも多くの時間を費やしたさらに別の問題。Maven Central で ThreeTen を探すとthreetenbp、 ではなくのパッケージのみが表示されますthreetenabpThreeTenABPのgithub リポジトリにアクセスcompile 'this-or-that'すると、Readme の [ダウンロード] セクションの下に悪名高い行が表示されます。

最初にこの github リポジトリにアクセスしたとき、そのコンパイル行の意味がわからなかったので、端末で実行しようとしました (明らかで予測可能な失敗がありました)。com.jakewharton.threetenabpイライラして、残りを理解してからしばらくしてから、レポではなく、レポを指している Maven Repo 行であることに最終的に気付きましたorg.threeten。そのため、ThreeTenABP パッケージは Maven リポジトリにないと思いました。

まとめ: 機能させる

今ではすべてがとても簡単に思えます。[project folder]/app/build.gradleファイルのセクションに次のimplementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'行があることを確認することで、Android プロジェクトで最新の処理関数を取得できます。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);
        //...
    }
}
于 2016-08-12T16:36:26.833 に答える
13
于 2020-05-05T00:35:59.177 に答える
6

Android Studio のビルド gradle (モジュール レベル) ファイルに次を追加します。

implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'

Application クラスを作成し、次のように初期化します。

class App : Application() {
    override fun onCreate() {
        super.onCreate()
        AndroidThreeTen.init(this)
    }
}
于 2019-08-18T17:02:58.770 に答える