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

「水曜日」シーズン1の中心には大きなミステリーがあります

「水曜日」シーズン1の中心には大きなミステリーがあります

Netflixの「水曜日」は、典型的な10代のドラマ以上のものであり、実際、シーズン1にはその中心に大きなミステリーがあります.

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ケイト・ミドルトンは、州の夕食会と州の訪問中にカミラ・パーカー・ボウルズからスポットライトを奪いたくなかった、と専門家は言う.

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンが、オリビア・ワイルドが彼女とハリー・スタイルズとの間の「難しい」が「非常に友好的」な分割を恒久的にすることを望んでいる理由を見つけてください.

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンが舞台裏で「非常に困難な時期」を過ごしていたと伝えられている理由を調べてください.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

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

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

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

Total War:Warhammer:Kotakuレビュー

Total War:Warhammer:Kotakuレビュー

私はこのゲームを嫌う準備ができていました。先週の前に、Total War:Warhammerについての私の考えがありました:それでもここに私は、私の手にある完成品であり、私は変わった男です。

涙の道:軍事化された帝国主義勢力がスタンディングロックキャンプを占領

涙の道:軍事化された帝国主義勢力がスタンディングロックキャンプを占領

スタンディングロックスー族のメンバーと水の保護者は、ノースダコタ州のスタンディングロックにあるオセティサコウィンキャンプを去ります。(Twitter経由のCNNスクリーンショット)火と煙がスカイラインを覆い、スタンディングロックスー族のメンバーと水の保護者が、聖なるものを守りながら建てた家、オセティサコウィン(セブンカウンシルファイアーズ)キャンプから行進し、太鼓を打ち、歌い、祈りました。ダコタアクセスパイプラインとしても知られる「ブラックスネーク」からの土地。

シアーズとKマートはイヴァンカ・トランプの商品を自分たちで取り除いています

シアーズとKマートはイヴァンカ・トランプの商品を自分たちで取り除いています

写真:APシアーズとKマートは、イヴァンカ・トランプのトランプホームアイテムのコレクションも、誰も購入したくないために削除しました。シアーズとKマートの両方の親会社であるシアーズホールディングスは、土曜日のABCニュースへの声明で、彼らが気にかけていると辛抱強く説明しましたトランプラインを売り続けるにはお金を稼ぐことについてあまりにも多く。

ポテトチップスでたった10分でスペインのトルティーヤを作る

ポテトチップスでたった10分でスペインのトルティーヤを作る

伝統的なスペインのトルティーヤは通常、オリーブオイルで柔らかくなるまで調理されたポテトから始まります(30分以上かかる場合があります)が、ケトルで調理されたポテトチップスの助けを借りてわずか10分でテーブルに置くことができます。上のビデオはすべてがバラバラにならないように裏返す方法を含め、レシピ全体を説明しますが、必要なのは4〜5個の卵と3カップのケトルチップスだけです。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

ホームオフィスのセットアップ術を極めよう!AppExert の開発者は、家族全員が一緒にいる場合でも、在宅勤務の技術を習得しています。祖父や曽祖父が共同家族で暮らしていた頃の記憶がよみがえりました。

2022 年、私たちのデジタル ライフはどこで終わり、「リアル ライフ」はどこから始まるのでしょうか?

20 年前のタイムトラベラーでさえ、日常生活におけるデジタルおよびインターネットベースのサービスの重要性に驚くことでしょう。MySpace、eBay、Napster などのプラットフォームは、高速化に焦点を合わせた世界がどのようなものになるかを示してくれました。

ニューロマーケティングの秘密科学

ニューロマーケティングの秘密科学

マーケティング担当者が人間の欲望を操作するために使用する、最先端の (気味が悪いと言う人もいます) メソッドを探ります。カートをいっぱいにして 3 桁の領収書を持って店を出る前に、ほんの数点の商品を買いに行ったことはありませんか? あなたは一人じゃない。

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

私たちが住んでいる世界を確実に理解するには、データが必要です。ただし、空間参照がない場合、このデータは地理的コンテキストがないと役に立たなくなる可能性があります。

Language