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

200
kael 2016-08-13 06:36.

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

3 answers

200
kael 2016-08-13 06: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
Basil Bourque 2020-05-05 14: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
Richard Kamere 2019-08-19 07:02.

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

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

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

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

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

グッドジョブ、ESPN

グッドジョブ、ESPN

今日のホワイトハウスの記者会見で、報道官のサラ・ハッカビー・サンダースは、スポーツセンターのホストであるイェメル・ヒルのドナルド・トランプに関する最近のツイートについてコメントするよう求められ、大統領と彼の政策を白人至上主義者として説明した。ヒルは彼女のつぶやきのためにESPNによって公に叱責されました。

アマゾンからのこのレミントンツールセールで髪を整える、スタイルを整える、乾かす、または取り除く

アマゾンからのこのレミントンツールセールで髪を整える、スタイルを整える、乾かす、または取り除く

基本的に頭のあらゆる部分から髪の毛を整えたり、ブロードライしたり、まっすぐにしたり、脱毛したりする必要がある場合は、このレミントンゴールドボックスが最適です。今日だけ、Amazonは、すでに人気のあるShortcut Pro Self-HaircutKitやPearlPro Ceramic Flat Ironのように、グルーミングをはるかに簡単にするヘアツールをマークダウンしています。

カナダの元桂冠詩人が、史上最高の文化の盗用でトゥパックとマヤアンジェロウから盗んだ

カナダの元桂冠詩人が、史上最高の文化の盗用でトゥパックとマヤアンジェロウから盗んだ

トゥパックシャクール(ティムモーゼンフェルダー/ゲッティイメージズ); マヤアンジェロウ(マーティンゴッドウィン/ゲッティイメージズ)移動、テイラースウィフト。ケンドールとカイリーは、必要な数の座席を持っています。

テスラは、ハリケーンイルマによる避難を容易にするために、フロリダでの車両の範囲を拡大しています

テスラは、ハリケーンイルマによる避難を容易にするために、フロリダでの車両の範囲を拡大しています

写真:Tesla Motorsフロリダに住んでいて、Tesla Model S、Model X 60、またはModel 60Dを使用している場合、車の自律性は50 km(約30マイル)高くなります。これは失敗ではなく、ハリケーンイルマによる避難作業を容易にするために会社自身が命じた自治権の一時的な延長です。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

投資ノート:Bioscout AU$300万シード

投資ノート:Bioscout AU$300万シード

Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。

ムーアの法則を超えて

ムーアの法則を超えて

計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。

Language