Увага: підтримка знедолення Java 8+ API (Android Gradle Plugin 4.0.0+)
Розвиток цієї бібліотеки ( ThreeTenABP ) закінчується. Будь ласка, подумайте про перехід на Android Gradle плагін 4.0, java.time. * Та його основну функцію знежирення бібліотеки в найближчі місяці.
Щоб увімкнути підтримку цих мовних API на будь-якій версії платформи Android, оновіть плагін 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.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 і вище, ви не можете покладатися на функції мови 8 Java (я фактично не впевнений, що це 100% правда, але я це розумію). Так java.time
виходить.
Наступним варіантом може бути Joda-Time , оскільки JSR 310 базувався на Joda-Time. Однак, як вказує readme ThreeTenABP , з ряду причин Joda-Time - не найкращий варіант.
Далі йде ThreeTen-Backport , який підтримує багато (але не всі) функціональності Java 8 java.time
на Java 7. Це добре для більшості випадків використання, але, як зазначено в readme ThreeTenABP , у нього є проблеми з продуктивністю Android.
Отже, останній і, здавалося б, правильний варіант - ThreeTenABP .
Друге відкриття: інструменти побудови та управління залежностями
Оскільки складання програми - особливо тієї, що використовує купу зовнішніх бібліотек - є складною, Java майже незмінно використовує «інструмент побудови» для управління процесом. Make , Apache Ant , Apache Maven і Gradle - всі інструменти побудови, які використовуються з програмами Java (порівняння див. У цій публікації ). Як зазначалося далі, Gradle - це вибраний інструмент збірки для проектів Android.
Ці інструменти побудови включають управління залежностями. Здається, Apache Maven першим включив централізоване сховище пакетів. Maven представив центральний сховище Maven , який дозволяє функціонувати, еквівалентним php-там composer
з Packagist та Ruby's gem
з rubygems.org. Іншими словами, центральний сховище Maven - це Maven (та Gradle), що складається Packagist - композитор - остаточне та безпечне джерело для пакунків із версією.
Третє відкриття: Gradle обробляє залежності в Android-проектах
У моєму списку справ - читати тут документи Gradle , включаючи їх безкоштовні електронні книги. Якби я читав ці тижні тому, коли я почав вивчати Android, я б точно знав, що Gradle може використовувати Maven Central Repository для управління залежностями в Android-проектах. Крім того, як детально описано у цій відповіді StackOverflow, що стосується Android Studio 0.8.9, Gradle використовує Maven Central Repository неявно через JCenter Bintray, а це означає, що вам не потрібно робити додаткових конфігурацій для налаштування репо - просто ви перелічите список залежності.
Четверте відкриття: залежність проекту перерахована в [проект 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'
рядок у розділі Завантажити програму Readme.
Коли я вперше потрапив на цей github repo, я не знав, що означає цей рядок компіляції, і спробував запустити його в своєму терміналі (з очевидним і передбачуваним збоєм). Розчарований, я не повернувся до нього, поки довго не зрозумів решту, і нарешті зрозумів, що це лінія Maven Repo, що вказує на com.jakewharton.threetenabp
репо, на відміну від org.threeten
репо. Тому я подумав, що пакет ThreeTenABP не знаходиться в репоні Maven.
Короткий зміст: Налагодження його роботи
Зараз все здається досить легко. Ви можете отримати сучасні функції обробки часу в проекті Android, переконавшись, що ваш [project folder]/app/build.gradle
файл містить implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'
рядок у своєму 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);
//...
}
}