Как использовать ThreeTenABP в Android-проекте

Я добавляю этот вопрос, потому что я новичок в Java и Android, и я искал часы, пытаясь понять это. Ответ исходил из сочетания соответствующих ответов, поэтому я решил, что буду документировать то, что я узнал для всех, кто может борется. См. Ответ.

Для немного фона, мой опыт - это в основном веб-разработка в PHP и немного Ruby. Моя единственная ОС - это Linux (Ubuntu Studio), и я (беззастенчиво) разрабатываю свое первое приложение для 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)
4b9b3361

Первое открытие: почему вам нужно использовать ThreeTenABP Вместо java.time, ThreeTen-Backport или даже Joda-Time

Это очень короткая версия ОЧЕНЬ ДЛИННОГО ПРОЦЕССА для определения нового стандарта. Все эти пакеты - почти то же самое: библиотеки, которые обеспечивают хорошую современную функциональность обработки времени для Java. Различия тонкие, но важные.

Наиболее очевидным решением будет использование встроенного пакета java.time, поскольку это новый стандартный способ обработки времени и дат в Java. Это реализация JSR 310, которая стала новым стандартным предложением для обработки времени на основе библиотеки Joda-Time.

Однако java.time был представлен на Java 8. Android до Marshmallow работает на Java 7 ("Android N" - первая версия, в которой представлены возможности языка Java 8). Таким образом, если вы не нацелитесь на Android N Nougat и выше, вы не можете полагаться на языковые функции Java 8 (я не уверен, что это на 100% верно, но я так понимаю). Так что java.time работает.

Следующим вариантом может быть Joda-Time, поскольку JSR 310 был основан на Joda-Time. Тем не менее, как видно из сообщения ThreeTenABP, по ряду причин Joda-Time - не самый лучший вариант.

Далее следует ThreeTen-Backport, который поддерживает многие (но не все) Java Java-функции java.time для Java 7. Это нормально для большинства случаев использования, но, как указано в readTimeTratABP, у него есть проблемы с производительностью Android.

Таким образом, последний и, казалось бы, правильный вариант - ThreeTenABP.

Второе открытие: инструменты сборки и управление зависимостями

Поскольку компиляция программы, особенно с использованием нескольких внешних библиотек, является сложной, Java почти всегда использует инструмент "build" для управления процессом. Make, Apache Ant, Apache Maven и Gradle - все инструменты сборки, которые используются с Java-программами (см. Этот пост для сравнений). Как отмечено ниже, Gradle является выбранным инструментом сборки для проектов Android.

Эти инструменты построения включают управление зависимостями. Apache Maven, по-видимому, первым включил централизованный репозиторий пакетов. Maven представил Maven центрального хранилища, что позволяет функциональность, эквивалентную PHP composer с Packagist и рубинового gem с rubygems.org. Другими словами, Центральный репозиторий Maven - это Maven (и Gradle), что Packagist для композитора - окончательный и безопасный источник для версий пакетов.

Третье открытие: Gradle управляет зависимостями в проектах Android

Высоко на моем списке дел, чтобы читать документы Gradle здесь, в том числе их бесплатных электронных книг. Если бы я прочитал эти недели назад, когда начал изучать Android, я бы наверняка знал, что Gradle может использовать центральный репозиторий Maven для управления зависимостями в проектах Android. Кроме того, как подробно описано в этом ответе StackOverflow, как и в Android Studio 0.8.9, Gradle использует Maven Central Repository неявно через Bintray JCenter, что означает, что вам не нужно делать какие-либо дополнительные настройки для настройки репо - вы просто перечислите зависимостей.

Четвёртое обнаружение: Зависимости проекта перечислены в [project dir]/app/build.gradle

Опять же, очевидно для тех, кто имеет опыт использования Gradle на Java, но мне потребовалось некоторое время, чтобы понять это. Если вы видите, что люди говорят "О, просто добавьте compile 'this-or-that.jar' "или что-то подобное, знайте, что compile является директивой в файле build.gradle, который указывает зависимости времени компиляции. Вот официальная страница Gradle об управлении зависимостями.

Пятое открытие: ThreeTenABP управляется Джейком Уортоном, а не ThreeTen

Еще одна проблема, которую я потратил слишком много времени на выяснение. Если вы ищете ThreeTen в Maven Central, вы увидите только пакеты для threetenbp, а не threetenabp. Если вы перейдете на ретрансляцию github для ThreeTenABP, вы увидите эту печально известную compile 'this-or-that' строки compile 'this-or-that' разделе "Загрузка" Readme.

Когда я впервые попал в этот репозиторий github, я не знал, что означает эта строка компиляции, и я попытался запустить его в своем терминале (с очевидным и прогнозируемым сбоем). Разочарованный, я не возвращался к нему до тех пор, пока я не понял все остальное, и, наконец, понял, что это линия Maven Repo, указывающая на com.jakewharton.threetenabp, в отличие от org.threeten repo. Вот почему я думал, что пакет ThreeTenABP не был в репозитории Maven.

Резюме: Задание

Теперь все выглядит довольно легко. Вы можете получить современные функции обработки времени в проекте Android, убедившись, что ваш файл [project folder]/app/build.gradle имеет compile 'com.jakewharton.threetenabp:threetenabp:1.0.3' в разделе 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.0.3'
}
97
ответ дан 12 авг. '16 в 19:36
источник