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

Aug 12 2016

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

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

回答

200 kael Aug 12 2016 at 23:36

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

AndroidGradleプラグイン4.0.0+を介してJava8 + API脱糖サポートが利用可能になりました

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

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.timeThreeTen・バックポート、あるいはジョダタイム

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

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

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

JSR 310はJoda-Timeに基づいていたため、次のオプションはJoda-Timeである可能性があります。ただし、ThreeTenABP readmeが示すように、いくつかの理由から、Joda -Timeは最良のオプションではありません。

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

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

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

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

これらのビルドツールには、依存関係の管理が含まれています。Apache Mavenは、一元化されたパッケージリポジトリを最初に組み込んだようです。MavenはMavenCentral Repositoryを導入しました。これによりcomposer、Packagistではphp 、rubygems.orgではRubyと同等の機能が可能になりますgem。言い換えると、Maven中央リポジトリはMaven(およびGradle)にとって、Packagistがコンポーザーにとって何であるか(バージョン管理されたパッケージの決定的で安全なソース)です。

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

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

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

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

5番目の発見:ThreeTenABPは、ThreeTenではなくJakeWhartonによって管理されています

さらに別の問題を理解するのに時間がかかりすぎました。Maven CentralでThreeTenを検索するとthreetenbp、のパッケージのみが表示され、threetenabp。は表示されません。ThreeTenABPgithubリポジトリにアクセスするcompile 'this-or-that'と、Readmeのダウンロードセクションの下にその悪名高い行が表示されます。

このgithubリポジトリに最初にアクセスしたとき、そのコンパイル行の意味がわからなかったので、ターミナルで実行しようとしました(明らかで予測可能な失敗がありました)。イライラして、残りの部分を理解してからしばらく経つまで戻ってこなかったのですが、最終的には、com.jakewharton.threetenabpレポではなく、レポを指すMavenレポラインであることに気付きました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);
        //...
    }
}
8 BasilBourque May 05 2020 at 07:35

kaelによって受け入れられた回答は正しいです。さらに、いくつかのことについて言及し、java.time機能の取得に関する図を提供します。

Android26以降に組み込まれたjava.time

Android 26以降を対象とする場合は、AndroidにバンドルされているJSR 310java.timeクラス)の実装があります。ThreeTenABPを追加する必要はありません。

ほぼ同一のAPI

ただ、明確にするために、ThreeTenABP Android用は適応のあるThreeTen-バックポートのほとんどもたらしライブラリjava.timeのに機能をJavaの6およびJavaの7。このバックポートは、java.timeとほぼ同じAPIを共有します。

26より前のAndroidをターゲットにしているため、ThreeTenABPを使用するとします。後で、Androidにバンドルされているjava.timeクラスを使用するために、これらの以前のバージョンのAndroidのサポートを最終的に削除する可能性があります。その場合、import(a)ステートメントの切り替え、および(b)org.threeten.bp.DateTimeUtils古いレガシー日時クラスに追加された新しい変換メソッドを使用するために行った呼び出しを変更する以外に、コードベースにいくつかの変更を加える必要があります(DateGregorianCalendar) 。

移行プロセスThreeTenABPjava.timeは滑らかとほぼ無痛されるべきです。

どのフレームワークをいつ使用するか

これは、3つのフレームワークを示し、どのシナリオでどのフレームワークをいつ使用するかを示すグラフです。

➥更新: Android Gradleプラグイン4.0.0+は、新しい4番目のオプションであるAPI脱糖をもたらし、以前のAndroidに元々組み込まれていなかったjava.time機能のサブセットを利用できるようにします。kaelによるメインの回答の上部を参照してください。


java.timeについて

java.timeフレームワークは、Java8以降に組み込まれています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスをjava.util.DateCalendar、& SimpleDateFormat

詳細については、Oracleチュートリアルを参照してください。そして、StackOverflowで多くの例と説明を検索してください。仕様はJSR310です。

ジョダタイムプロジェクトは、今でメンテナンスモードへの移行をアドバイスjava.timeのクラス。

java.timeオブジェクトをデータベースと直接交換できます。JDBC4.2以降に準拠したJDBCドライバーを使用してください。文字列もクラスも必要ありません。Hibernate5およびJPA2.2はjava.timeをサポートしますjava.sql.*

java.timeクラスはどこで入手できますか?

5 RichardKamere Aug 19 2019 at 00:02

AndroidStudioのビルドgradleファイルに以下を追加します。

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

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

class App : Application() {
    override fun onCreate() {
        super.onCreate()
        AndroidThreeTen.init(this)
    }
}