Je pose cette question parce que je suis nouveau sur Java et Android et j'ai recherché des heures à essayer de comprendre cela. La réponse provenait d'une combinaison de J'ai donc pensé documenter ce que j'ai appris pour toute autre personne en difficulté. Voir la réponse.
J'utilise Android Studio 2.1.2. Mon Java Le programme d'installation est le suivant:
>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)
Ceci est une version très courte du très long processus de définition d'un nouveau standard. Tous ces paquets sont à peu près la même chose: des bibliothèques qui fournissent une fonctionnalité de gestion du temps moderne et de qualité pour Java. Les différences sont subtiles mais importantes.
La solution la plus évidente serait d'utiliser le package intégré Java.time
, puisqu'il s'agit du nouveau moyen standard de gérer l'heure et les dates en Java. Il s'agit d'une implémentation de JSR 310 , qui était une nouvelle proposition standard de gestion du temps basée sur la bibliothèque Joda-Time .
Cependant, Java.time
A été introduit dans Java 8 . Android jusqu'à Marshmallow fonctionne sur Java 7 ("Android N" est la première version à introduire Java 8 fonctionnalités de langage). Ainsi, à moins que vous ne cibliez que Android N Nougat et supérieur, vous ne pouvez pas compter sur Java 8 fonctionnalités du langage ( Je ne suis pas vraiment sûr que cela soit vrai à 100%, mais c'est comme ça que je le comprends). Donc Java.time
Est sorti.
L'option suivante pourrait être Joda-Time , puisque JSR 310 était basé sur Joda-Time. Toutefois, comme l'indique le fichier ThreeTenABP , pour un certain nombre de raisons, Joda-Time n'est pas la meilleure option.
Suivant est ThreeTen-Backport , qui transfère beaucoup (mais pas la totalité) des Java 8 Java.time
à Java 7. Cela convient à la plupart des cas d’utilisation, mais, comme indiqué dans le Fichier Lisezmoi de ThreeTenABP , il a des problèmes de performances avec Android.
La dernière option apparemment correcte est donc ThreeTenABP .
Étant donné que la compilation d'un programme - en particulier d'un programme utilisant plusieurs bibliothèques externes - est complexe, Java utilise presque toujours un "outil de génération" pour gérer le processus. Marque , Apache Ant , Apache Maven , et Gradle sont tous des outils de construction qui sont utilisé avec les programmes Java (voir cet article pour les comparaisons). Comme indiqué plus bas, Gradle est l'outil de construction choisi pour les projets Android.
Ces outils de construction incluent la gestion des dépendances. Apache Maven semble être le premier à inclure un référentiel de paquets centralisé. Maven a présenté le Maven Central Repository , qui offre des fonctionnalités équivalentes à celles de php composer
avec Packagist et Ruby gem
avec rubygems.org. En d'autres termes, le référentiel central Maven représente pour Maven (et Gradle) ce que Packagist est pour composer - une source définitive et sécurisée pour les packages versionnés.
Mon top sur ma liste de choses à faire est de lire la documentation de Gradle ici , y compris leurs eBooks gratuits. Si j'avais lu ces dernières semaines lorsque j'ai commencé à apprendre Android, j'aurais sûrement su que Gradle pouvait utiliser le référentiel central Maven pour gérer les dépendances dans les projets Android. En outre, comme indiqué dans this StackOverflow, à partir de Android Studio 0.8.9, Gradle utilise implicitement le référentiel central Maven via le JCenter de Bintray, ce qui signifie que vous n'avez pas à Extra config pour configurer le repo - il vous suffit de lister les dépendances.
Encore une fois, évident pour ceux qui ont déjà utilisé Gradle en Java, mais il m'a fallu un certain temps pour comprendre cela. Si vous voyez des gens dire "Oh, ajoutez simplement compile 'this-or-that.jar'
" Ou quelque chose de similaire, sachez que compile
est une directive de ce fichier build.gradle qui indique les dépendances à la compilation. Voici la page officielle de Gradle sur la gestion des dépendances.
Encore un autre problème que j'ai passé trop de temps à résoudre. Si vous recherchez ThreeTen dans Maven Central, vous ne verrez que les paquets pour threetenbp
, pas threetenabp
. Si vous allez dans le repo github de ThreeTenABP , vous verrez cette fameuse ligne compile 'this-or-that'
Sous la section Téléchargement du fichier Lisez-moi.
Lorsque j'ai frappé pour la première fois avec ce dépôt github, je ne savais pas ce que signifiait cette ligne de compilation et j'ai essayé de l'exécuter dans mon terminal (avec un échec évident et prévisible). Frustré, je n'y suis revenu que longtemps après avoir compris le reste, et enfin compris qu'il s'agissait d'une ligne Maven Repo pointant vers le repo com.jakewharton.threetenabp
, Par opposition au repo org.threeten
. C'est pourquoi j'ai pensé que le package ThreeTenABP ne figurait pas dans le dépôt Maven.
Maintenant, tout semble assez facile. Vous pouvez obtenir des fonctions modernes de gestion du temps dans un projet Android en vous assurant que votre fichier [project folder]/app/build.gradle
Comporte la ligne compile 'com.jakewharton.threetenabp:threetenabp:1.0.3'
Dans sa section 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'
}
Ajoutez également ceci à la classe d'application:
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
AndroidThreeTen.init(this);
//...
}
}
Ajoutez ce qui suit dans votre fichier de classement.
/* Android back port for Java time */
implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'
Créez la classe d'application et initialisez-la.
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
AndroidThreeTen.init(this);
}
}