Cómo usar ThreeTenABP en un proyecto de Android

200
kael 2016-08-13 06:36.

Estoy haciendo 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 pudiera estar luchando. Ver respuesta.

Estoy usando Android Studio 2.1.2 y 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)

3 answers

200
kael 2016-08-13 06:36.

Atención: esta respuesta, aunque técnicamente correcta, ahora está desactualizada

La compatibilidad con la eliminación de azúcar de la API de Java 8+ ahora está disponible a través del complemento Gradle de Android 4.0.0+

(Vea también la respuesta de Basil Bourque a continuación )

El desarrollo de la biblioteca ThreeTenABP está terminando. En los próximos meses, considere cambiar al complemento de Android Gradle 4.0, java.time. *, Y su función de eliminación de azúcar de la biblioteca principal.

Para habilitar la compatibilidad con estas API de idiomas en cualquier versión de la plataforma de Android, actualice el complemento de Android a 4.0.0 (o superior) e incluya lo siguiente en el archivo build.gradle de su módulo:

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'
}

Respuesta original

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

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

La solución más obvia sería utilizar el java.timepaquete integrado , ya que esta es la nueva forma estándar de tratar la 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 basada en la biblioteca Joda-Time .

Sin embargo, java.timese introdujo en Java 8 . Android hasta Marshmallow se ejecuta en Java 7 ("Android N" es la primera versión que presenta características del lenguaje Java 8). Por lo tanto, a menos que solo esté apuntando a Android N Nougat y superior, no puede confiar en las características del lenguaje Java 8 (en realidad no estoy seguro de que esto sea 100% cierto, pero así es como lo entiendo). Así que java.timeestá 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éame de ThreeTenABP , por varias razones, Joda-Time no es la mejor opción.

El siguiente es ThreeTen-Backport , que transfiere gran parte (pero no toda) de la java.timefuncionalidad Java 8 a Java 7. Esto está bien para la mayoría de los casos de uso, pero, como se indica en el archivo Léame de ThreeTenABP , tiene problemas de rendimiento con Android.

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

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

Dado que compilar un programa, especialmente uno que usa un montón de bibliotecas externas, es complejo, Java casi invariablemente usa una "herramienta de construcción" para administrar el proceso. Make , Apache Ant , Apache Maven y Gradle son herramientas de compilación que se utilizan con programas Java (consulte esta publicación para obtener comparaciones). Como se indica más abajo, Gradle es la herramienta de compilación elegida para proyectos de Android.

Estas herramientas de compilación incluyen la gestión de dependencias. Apache Maven parece ser el primero en incluir un repositorio de paquetes centralizado. Maven introdujo el repositorio central de Maven , que permite una funcionalidad equivalente a php composercon Packagist y Ruby gemcon rubygems.org. En otras palabras, el repositorio central de Maven es para Maven (y Gradle) lo que Packagist es para compositor: una fuente definitiva y segura para paquetes versionados.

Tercer descubrimiento: Gradle maneja dependencias en proyectos de Android

En lo más alto de mi lista de tareas pendientes está leer los documentos de Gradle aquí , incluidos sus libros electrónicos gratuitos. Si hubiera leído estas semanas cuando comencé a aprender sobre Android, seguramente hubiera sabido que Gradle puede usar el Repositorio central de Maven para administrar dependencias en proyectos de Android. Además, como se detalla en esta respuesta de StackOverflow, a partir de Android Studio 0.8.9, Gradle usa el repositorio central de Maven implícitamente a través del JCenter de Bintray, lo que significa que no tiene que hacer ninguna configuración adicional para configurar el repositorio, solo enumera el dependencias.

Cuarto descubrimiento: las dependencias del proyecto se enumeran en [directorio del proyecto] /app/build.gradle

Nuevamente, es obvio para aquellos que tienen alguna experiencia en el uso de Gradle en Java, pero me tomó un tiempo darme cuenta de esto. Si ve personas que dicen "Oh, simplemente agregue compile 'this-or-that.jar'" o algo similar, sepa que compilehay una directiva en ese archivo build.gradle que indica dependencias en tiempo de compilació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 en el que pasé demasiado tiempo resolviendo. Si busca ThreeTen en Maven Central, solo verá paquetes para threetenbp, no threetenabp. Si va al repositorio de github para ThreeTenABP , verá esa compile 'this-or-that'línea infame en la sección Descargar del archivo Léame.

Cuando llegué por primera vez a este repositorio de github, no sabía qué significaba esa línea de compilación e intenté ejecutarlo en mi terminal (con un error obvio y predecible). Frustrado, no volví a él hasta mucho después de haber descubierto el resto, y finalmente me di cuenta de que es una línea de Maven Repo que apunta al com.jakewharton.threetenabprepositorio, a diferencia del org.threetenrepositorio. Por eso pensé que el paquete ThreeTenABP no estaba en el repositorio 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 [project folder]/app/build.gradlearchivo tenga la implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'línea en su dependenciessección:

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'
}

También agregue esto a la clase de aplicación:

public class App extends Application {    
    @Override
    public void onCreate() {
        super.onCreate();
        AndroidThreeTen.init(this);
        //...
    }
}
8
Basil Bourque 2020-05-05 14:35.

La respuesta aceptada por kael es correcta. Además, mencionaré un par de cosas y proporcionaré un diagrama sobre cómo obtener la funcionalidad java.time .

java.time integrado en Android 26+

Si tiene como objetivo Android 26 o posterior, encontrará una implementación de JSR 310 ( clases java.time ) incluida con Android. No es necesario agregar ThreeTenABP .

API casi idénticas

Solo para aclarar, ThreeTenABP para Android es una adaptación de la biblioteca ThreeTen-Backport que trae la mayor parte de la funcionalidad java.time a Java 6 y Java 7 . Este back-port comparte casi una API idéntica con java.time .

Suponga que ahora está apuntando a Android anterior a 26, por lo que usa ThreeTenABP . Más adelante, es posible que eventualmente deje de admitir estas versiones anteriores de Android, para usar las clases java.time incluidas con Android. Cuando eso suceda, necesitará realizar algunos cambios en su código base además de (a) cambiar importdeclaraciones y (b) cambiar cualquier llamada que haya realizado org.threeten.bp.DateTimeUtilspara usar los nuevos métodos de conversión que se agregaron a las antiguas clases de fecha y hora heredadas ( Date, GregorianCalendar) .

El proceso de transición de ThreeTenABP a java.time debe ser fluido y casi indoloro.

Cuándo usar qué marco

Aquí hay un gráfico que muestra los tres marcos e indica cuándo usar cuál en qué escenarios.

➥ Actualización: Android Gradle Plugin 4.0.0+ trae una nueva cuarta opción, API desugaring para poner a disposición un subconjunto de la funcionalidad java.time no originalmente integrado en Android anterior. Vea la parte superior de la respuesta principal de Kael.


Acerca de java.time

El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como java.util.Date, Calendar, y SimpleDateFormat.

Para obtener más información, consulte el tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .

El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .

Puede intercambiar objetos java.time directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No se necesitan cuerdas, no se necesitan java.sql.*clases. Hibernate 5 y JPA 2.2 admiten java.time .

¿Dónde obtener las clases java.time?

5
Richard Kamere 2019-08-19 07:02.

Agregue lo siguiente en su archivo de compilación gradle en Android Studio.

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

Cree la clase de aplicación e inicialícela así:

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

Related questions

MORE COOL STUFF

La estrella de HGTV, Christina Hall, revela que tiene 'envenenamiento por mercurio y plomo' probablemente por voltear 'casas asquerosas'

La estrella de HGTV, Christina Hall, revela que tiene 'envenenamiento por mercurio y plomo' probablemente por voltear 'casas asquerosas'

La estrella de HGTV, Christina Hall, revela que le diagnosticaron envenenamiento por mercurio y plomo, probablemente debido a su trabajo como manipuladora de casas.

La estrella de 'Love Is Blind' Brennon Lemieux responde a los cargos de violencia doméstica

La estrella de 'Love Is Blind' Brennon Lemieux responde a los cargos de violencia doméstica

Recientemente salió a la luz un informe policial que acusa a la estrella de 'Love Is Blind', Brennon, de violencia doméstica. Ahora, Brennon ha respondido a los reclamos.

Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia Judd en un momento festivo de pánico

Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia Judd en un momento festivo de pánico

Conozca cómo Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia mientras organizaba la primera celebración de Acción de Gracias desde que murió su madre, Naomi Judd.

Experto en lenguaje corporal explica los 'paralelos' entre Kate Middleton y la princesa Diana

Experto en lenguaje corporal explica los 'paralelos' entre Kate Middleton y la princesa Diana

Descubra por qué un destacado experto en lenguaje corporal cree que es fácil trazar "tales paralelismos" entre la princesa Kate Middleton y la princesa Diana.

Los láseres arrojan luz sobre por qué necesita cerrar la tapa antes de descargar

Los láseres arrojan luz sobre por qué necesita cerrar la tapa antes de descargar

Los inodoros arrojan columnas de aerosol invisibles con cada descarga. ¿Como sabemos? La prueba fue capturada por láseres de alta potencia.

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!

¿Caduca el repelente de insectos?

¿Caduca el repelente de insectos?

¿Sigue siendo efectivo ese lote de repelente de insectos que te quedó del verano pasado? Si es así, ¿por cuánto tiempo?

Mire a este policía escalar una situación sin otra razón que ser un idiota

Mire a este policía escalar una situación sin otra razón que ser un idiota

Captura de pantalla del video de Facebook Para aquellos de ustedes que pueden ser demasiado jóvenes para saber esto, antes de que Ice-T fuera una gran estrella en Ley y orden: Unidad de víctimas especiales, era uno de los mejores raperos gangsta de Los Ángeles de todos los tiempos. De hecho, estaba haciendo gangsta rap antes que N.

Reemplace 'Cargado racialmente' por 'Racista' con esta extensión de Chrome

Reemplace 'Cargado racialmente' por 'Racista' con esta extensión de Chrome

Imagen a través de WHAS 11 Algunas cosas realmente podrían tener "carga racial" sin ser racistas. Pero en los principales medios de comunicación, el primero suele ser un código para el segundo.

Proud Mary de Taraji P. Henson es una gran protagonista en busca de una buena película

Proud Mary de Taraji P. Henson es una gran protagonista en busca de una buena película

Foto: Sony Taraji P. Henson, experta tanto en reacciones cáusticas como en expresiones con los ojos húmedos de abrumador conflicto interno, es una actriz dinámica.

Gregg Popovich: LaMarcus Aldridge pidió ser intercambiado este verano, pero ahora estamos bien

Gregg Popovich: LaMarcus Aldridge pidió ser intercambiado este verano, pero ahora estamos bien

Foto: Ronald Martinez / Getty El grandote de los Spurs, LaMarcus Aldridge está teniendo quizás la temporada más eficiente de su carrera mientras reemplaza a Kawhi Leonard como el jugador principal de San Antonio. Mientras que los Warriors y los Rockets están en una carrera armamentista para ver quién puede disparar 100 triples en un juego primero, los Spurs están escondidos detrás de Houston.

Patinaje artístico de EE. UU. 'frustrado' por falta de decisión final en evento por equipos, pide una decisión justa

Patinaje artístico de EE. UU. 'frustrado' por falta de decisión final en evento por equipos, pide una decisión justa

El equipo está a la espera de las medallas que ganó en los Juegos Olímpicos de Invierno de 2022 en Beijing, ya que se está resolviendo un caso de dopaje que involucra a la patinadora artística rusa Kamila Valieva.

Los compradores de Amazon dicen que duermen 'como un bebé mimado' gracias a estas fundas de almohada de seda que cuestan tan solo $ 10

Los compradores de Amazon dicen que duermen 'como un bebé mimado' gracias a estas fundas de almohada de seda que cuestan tan solo $ 10

Miles de compradores de Amazon recomiendan la funda de almohada de seda Mulberry, y está a la venta en este momento. La funda de almohada de seda viene en varios colores y ayuda a mantener el cabello suave y la piel clara. Compre las fundas de almohada de seda mientras tienen hasta un 46 por ciento de descuento en Amazon

Se busca al corredor de los Bengals Joe Mixon por orden de arresto emitida por presuntamente apuntar con un arma de fuego a una mujer

Se busca al corredor de los Bengals Joe Mixon por orden de arresto emitida por presuntamente apuntar con un arma de fuego a una mujer

El jueves se presentó una denuncia de delito menor amenazante agravado contra Joe Mixon.

Profesor de la Universidad de Purdue arrestado por presuntamente traficar metanfetamina y proponer favores sexuales a mujeres

Profesor de la Universidad de Purdue arrestado por presuntamente traficar metanfetamina y proponer favores sexuales a mujeres

El Departamento de Policía de Lafayette comenzó a investigar a un profesor de la Universidad de Purdue en diciembre después de recibir varias denuncias de un "hombre sospechoso que se acercaba a una mujer".

Concept Drift: el mundo está cambiando demasiado rápido para la IA

Concept Drift: el mundo está cambiando demasiado rápido para la IA

Al igual que el mundo que nos rodea, el lenguaje siempre está cambiando. Mientras que en eras anteriores los cambios en el idioma ocurrían durante años o incluso décadas, ahora pueden ocurrir en cuestión de días o incluso horas.

India me está pateando el culo

India me está pateando el culo

Estoy de vuelta por primera vez en seis años. No puedo decirte cuánto tiempo he estado esperando esto.

ℝ

“And a river went out of Eden to water the garden, and from thence it was parted and became into four heads” Genesis 2:10. ? The heart is located in the middle of the thoracic cavity, pointing eastward.

¿Merrick Garland le ha fallado a Estados Unidos?

Es más de la mitad de la presidencia de Biden. ¿Qué está esperando Merrick Garland?

¿Merrick Garland le ha fallado a Estados Unidos?

Creo, un poco tarde en la vida, en dar oportunidades a la gente. Generosamente.

Language