tools - install gradle android studio
Cómo usar ThreeTenABP en Android Project (2)
Primer descubrimiento: por qué tienes 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 más o menos lo mismo: bibliotecas que proporcionan una funcionalidad de manejo moderna y buena para Java. Las diferencias son sutiles pero importantes.
La solución más obvia sería usar el paquete
java.time
, ya que esta es la nueva forma estándar de manejar 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.time
se introdujo en
Java 8
.
Android hasta
Marshmallow
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é 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).
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éame de ThreeTenABP , por varias razones, Joda-Time no es la mejor opción.
El siguiente es
ThreeTen-Backport
, que
ThreeTen-Backport
gran parte (pero no la totalidad) de la funcionalidad Java 8
java.time
a Java 7. Esto está bien para la mayoría de los casos de uso, pero, como se indica en el
archivo Léame ThreeTenABP
, tiene problemas de rendimiento con Androide.
Entonces, la última y aparentemente correcta opción es ThreeTenABP .
Segundo descubrimiento: herramientas de compilació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 siempre usa una "herramienta de compilació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 ver comparaciones). Como se señaló más abajo, Gradle es la herramienta de compilación elegida para proyectos de Android.
Estas herramientas de compilación incluyen gestión de dependencias.
Apache Maven parece ser el primero en incluir un repositorio de paquetes centralizado.
Maven presentó el
depósito central de Maven
, que permite una funcionalidad equivalente al
composer
de php con Packagist y la
gem
de Ruby con rubygems.org.
En otras palabras, Maven Central Repository es para Maven (y Gradle) lo que Packagist es para componer: una fuente definitiva y segura para paquetes versionados.
Tercer descubrimiento: Gradle maneja las dependencias en proyectos de Android
Lo más importante en mi lista de tareas pendientes es leer los documentos de Gradle here , incluidos sus libros electrónicos gratuitos. Si hubiera leído estas semanas cuando comencé a aprender Android, seguramente habría sabido que Gradle puede usar el depósito central de Maven para administrar dependencias en proyectos de Android. Además, como se detalla en this respuesta de StackOverflow, a partir de Android Studio 0.8.9, Gradle utiliza 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 debe enumerar el dependencias
Cuarto descubrimiento: las dependencias del proyecto se enumeran en [dir del proyecto] /app/build.gradle
Una vez más, es obvio para aquellos que tienen experiencia en el uso de Gradle en Java, pero me tomó un tiempo resolver esto.
Si ve personas que dicen "Oh, simplemente 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 compilación.
Here''s
la página oficial de Gradle sobre gestión de dependencias.
Quinto descubrimiento: ThreeTenABP es administrado por Jake Wharton, no por ThreeTen
Otro problema que pasé demasiado tiempo resolviendo.
Si busca ThreeTen en Maven Central, solo verá paquetes para
threetenbp
, no
threetenabp
.
Si va al
ThreeTenABP
, verá esa infame línea de
compile ''this-or-that''
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é ejecutarla en mi terminal (con un error obvio y predecible).
Frustrado, no volví a hacerlo hasta mucho después de que descubrí el resto, y finalmente me di cuenta de que era una línea de Maven Repo que apuntaba al repositorio
com.jakewharton.threetenabp
, a diferencia del repositorio
org.threeten
.
Es por eso que 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 de manejo modernas 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''
}
Agregue también esto a la clase de aplicación:
public class App extends Application { @Override public void onCreate() { super.onCreate(); AndroidThreeTen.init(this); //... } }
Estoy haciendo esta pregunta porque soy nuevo en Java y Android y busqué durante horas tratando de resolver esto. La respuesta vino de una combinación de respuestas relacionadas, así que pensé que documentaría lo que aprendí para cualquier otra persona que pueda estar luchando. Ver respuesta.
Estoy usando 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)
Agregue lo siguiente en su archivo gradle.
/* android back port for java time */ implementation ''com.jakewharton.threetenabp:threetenabp:1.2.1''
Crear clase de aplicación e inicializarla.
public class App extends Application { @Override public void onCreate() { super.onCreate(); AndroidThreeTen.init(this); } }