Cómo usar ThreeTenABP en Android Project

Estoy agregando esta pregunta porque soy nuevo en Java y Android y busqué durante horas tratando de resolver esto. La respuesta provino de una combinación de respuestas relacionadas, así que pensé que documentaría lo que aprendí para cualquier otra persona que esté teniendo problemas. Ver respuesta.

Por un poco de experiencia, mi experiencia es principalmente desarrollo web en PHP y un poco de Ruby. Mi único sistema operativo es Linux (Ubuntu Studio) y estoy (a regañadientes) desarrollando mi primera aplicación de Android en Android Studio 2.1.2. Mi configuración de Java es la siguiente:

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

Primer descubrimiento: por qué debe utilizar ThreeTenABP en lugar de java.time , ThreeTen-Backport o incluso Joda-Time

Esta es una versión realmente corta del MUY LARGO PROCESO de definición de un nuevo estándar. Todos estos paquetes son más o menos lo mismo: bibliotecas que proporcionan una buena y moderna funcionalidad de manejo de tiempo para Java. Las diferencias son sutiles pero importantes.

La solución más obvia sería utilizar el paquete java.time , ya que esta es la nueva forma estándar de java.time hora y las fechas en Java. Es una implementación de JSR 310 , que era una nueva propuesta estándar para el manejo del tiempo basado en la biblioteca Joda-Time .

Sin embargo, java.time se introdujo en Java 8 . Android hasta Marshmallow se ejecuta en Java 7 (“Android N” es la primera versión en introducir las características del lenguaje Java 8). Por lo tanto, a menos que solo esté orientado a Android N Nougat y superior, no puede confiar en las características del lenguaje Java 8 (no estoy seguro de que esto sea 100% cierto, pero así es como lo entiendo). Entonces java.time está fuera.

La siguiente opción podría ser Joda-Time , ya que JSR 310 se basó en Joda-Time. Sin embargo, como indica el archivo léxico ThreeTenABP , por varias razones, Joda-Time no es la mejor opción.

El siguiente es ThreeTen-Backport , que respalda mucho (pero no todos) la funcionalidad Java 8 java.time para Java 7. Esto está bien para la mayoría de los casos de uso, pero, como se indica en el archivo Readme de ThreeTenABP , tiene problemas de rendimiento con Androide.

Entonces, la última y aparentemente correcta opción es ThreeTenABP .

Segundo descubrimiento: herramientas de comstackción y gestión de dependencias

Debido a que la comstackción de un progtwig, especialmente uno que usa varias bibliotecas externas, es complejo, Java casi invariablemente usa una “herramienta de comstackción” para administrar el proceso. Make , Apache Ant , Apache Maven y Gradle son todas las herramientas de comstackción que se utilizan con los progtwigs de Java (consulte esta publicación para ver las comparaciones). Como se observa más abajo, Gradle es la herramienta de comstackción elegida para proyectos de Android.

Estas herramientas de comstackción incluyen administración de dependencias. Apache Maven parece ser el primero en incluir un repository centralizado de paquetes. Maven presentó el Repositorio Central de Maven , que permite la funcionalidad equivalente al composer de php con Packagist y la gem de Ruby con rubygems.org. En otras palabras, el Repositorio Central de Maven es para Maven (y Gradle) lo que Packagist es para el compositor: una fuente segura y definitiva para los paquetes versionados.

Tercer descubrimiento: Gradle maneja las dependencias en los proyectos de Android

Lo mejor de mi lista de tareas pendientes es leer aquí los documentos de Gradle, incluidos sus libros electrónicos gratuitos. Si hubiera leído esto hace unas semanas cuando comencé a aprender Android, seguramente habría sabido que Gradle puede usar el Repositorio Central de Maven para administrar las dependencias en los Proyectos de Android. Además, como se detalla en esta respuesta de StackOverflow, a partir de Android Studio 0.8.9, Gradle utiliza Maven Central Repository implícitamente a través de JCenter de Bintray, lo que significa que no tiene que hacer ninguna configuración adicional para configurar el repository. Simplemente haga una lista del dependencias.

Cuarto descubrimiento: las dependencias del proyecto están enumeradas en [project dir] /app/build.gradle

Nuevamente, es obvio para aquellos que tienen alguna experiencia con Gradle en Java, pero me tomó un tiempo darme cuenta de esto. Si ve gente diciendo “Ah, solo agregue compile 'this-or-that.jar' ” o algo similar, sepa que compile es una directiva en ese archivo build.gradle que indica dependencias en tiempo de comstackción. Aquí está la página oficial de Gradle sobre administración de dependencias.

Quinto descubrimiento: ThreeTenABP es administrado por Jake Wharton, no por ThreeTen

Otro problema más: pasé demasiado tiempo descifrando. Si busca ThreeTen en Maven Central, solo verá paquetes para threetenbp , no para threetenabp . Si vas al repository github para ThreeTenABP , verás esa infame línea de compile 'this-or-that' bajo la sección de descarga del archivo Léame.

La primera vez que pulsé este repository github, no sabía qué significaba esa línea de comstackción, y traté de ejecutarlo en mi terminal (con una falla obvia y predecible). Frustrado, no volví a hacerlo hasta mucho después de que calculé el rest, y finalmente me di cuenta de que es una línea Maven Repo que apunta al repository com.jakewharton.threetenabp , a diferencia del repo org.threeten . Es por eso que pensé que el paquete ThreeTenABP no estaba en el repository de Maven.

Resumen: hacer que funcione

Ahora todo parece bastante fácil. Puede obtener funciones modernas de manejo de tiempo en un proyecto de Android asegurándose de que su archivo [project folder]/app/build.gradle tenga la línea de compile 'com.jakewharton.threetenabp:threetenabp:1.0.3' en su sección de 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' }