Comment utiliser ThreeTenABP dans Android Project

j'ajoute cette question parce que je suis nouveau en Java et Android et j'ai cherché pendant des heures en essayant de comprendre cela. La réponse est venue d'une combinaison de réponses connexes, donc j'ai pensé que je documenterais ce que j'ai appris pour n'importe qui d'autre qui pourrait être en difficulté. Voir la réponse.

pour un peu de background, mon expérience est principalement le développement web en PHP et un peu de Ruby. Mon seul OS est Linux (Ubuntu Studio), et je suis (à contrecœur) en train de développer ma première application Android en Android Studio 2.1.2. Ma configuration Java est la suivante:

>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)
99
demandé sur Taryn 2016-08-12 19:36:26
la source

1 ответов

Première Découverte: Pourquoi Vous devez Utiliser ThreeTenABP au Lieu de de java.time , ThreeTen-Backport , ou même Joda-Time

c'est une version très courte du très LONG processus de définition d'une nouvelle norme. Tous ces paquets sont à peu près la même chose: des bibliothèques qui fournissent de bonnes fonctionnalités de gestion du temps moderne pour Java. Les différences sont subtile mais importante.

la solution la plus évidente serait d'utiliser le paquet intégré java.time , car c'est la nouvelle façon standard de traiter L'heure et les dates en Java. Il s'agit d'une mise en œuvre de JSR 310 , qui était une nouvelle proposition standard pour le traitement du temps basé 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 des fonctionnalités Java 8 langue). Ainsi, à moins que vous ne visiez que Android N Nougat et au-dessus, vous ne pouvez pas vous fier aux fonctionnalités linguistiques de Java 8 (Je ne suis pas sûr que ce soit 100% vrai, mais c'est comme ça que je le comprends). Donc java.time est sorti.

la prochaine option pourrait être Joda-Time , depuis JSR 310 était basé sur Joda-Time. Cependant, comme le ThreeTenABP readme indique, pour un certain nombre de raisons, Joda-temps n'est pas la meilleure option.

Next is ThreeTen-Backport , qui back-ports beaucoup (mais pas tous) de La Java 8 java.time fonctionnalité à Java 7. C'est très bien pour la plupart des cas, mais, comme indiqué dans le ThreeTenABP readme , il a des problèmes de performance avec Android.

donc la dernière option apparemment correcte est ThreeTenABP .

Deuxième Découverte: Outils de construction et de Gestion de la Dépendance

étant donné que la compilation d'un programme-en particulier un programme utilisant un tas de bibliothèques externes-est complexe, Java utilise presque invariablement un "outil de construction" pour gérer le processus. marque , Apache Ant , Apache Maven , et Gradle sont tous des outils de construction qui sont utilisés avec des programmes Java (voir ce post pour des comparaisons). Comme indiqué plus bas, Gradle est l'outil de construction choisi pour les projets Android.

ces outils de construction comprennent la gestion de la dépendance. Apache Maven semble être le premier à inclure un dépôt de paquets centralisé. Maven a présenté le Maven dépôt Central , qui permet des fonctionnalités équivalentes à composer de php avec Packagist et Ruby gem avec rubygems.org. En d'autres termes, le dépôt central de Maven est à Maven (et à Grad) ce que Packagist est à composer-un définitif et source sécurisée pour les paquets suivis en versions.

Troisième Découverte: Gradle Gère les Dépendances dans les Projets Android

haut sur ma liste de choses à faire est de lire les docs Gradle ici , y compris leurs livres gratuits. Si j'avais lu ces dernières semaines quand J'ai commencé à apprendre Android, j'aurais sûrement su que Gradle peut utiliser le dépôt central Maven pour gérer les dépendances dans les projets Android. En outre, ainsi qu'il est indiqué au point cette réponse de StackOverflow, à partir de Android Studio 0.8.9, Gradle utilise Maven Central Repository implicitement par L'intermédiaire du JCenter de Bintray, ce qui signifie que vous n'avez pas besoin de faire de configuration supplémentaire pour configurer le repo -- vous n'avez qu'à énumérer les dépendances.

Quatrième Découverte: les Dépendances d'un Projet Sont Énumérés dans le [projet dir]/app/build.gradle

encore une fois, évident pour ceux qui ont n'importe quelle expérience en utilisant Gradle en Java, mais il m'a fallu un certain temps pour comprendre cela hors. Si vous voyez les gens dire "Oh, il suffit d'ajouter compile 'this-or-that.jar' "ou quelque chose de similaire, sachez que compile est une directive dans cette construction.fichier gradle qui indique les dépendances du temps de compilation. Voici l'officiel Gradle page sur la gestion de la dépendance.

cinquième découverte: ThreeTenABP est géré par Jake Wharton, pas par ThreeTen

encore un autre problème que j'ai passé trop de temps à résoudre. Si vous cherchez ThreeTen à Maven Central , vous ne verrez les paquets que pour threetenbp , pas threetenabp . Si vous allez à la GitHub repo pour ThreeTenABP , vous verrez que infâme compile 'this-or-that' ligne sous la section de téléchargement du Readme.

Quand j'ai touché ce dépôt github, je ne savais pas ce que la ligne de compilation, et j'ai essayé dans mon terminal (avec une évidente et prévisible échec). Frustré, Je n'y suis retourné que bien après avoir compris le reste. , et finalement réalisé que c'est une ligne de Repo Maven pointant vers le com.jakewharton.threetenabp repo, par opposition au org.threeten repo. C'est pour ça que je pensais que le paquet de trois coups N'était pas dans le maven repo.

résumé: Making it work

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 a 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.0.3'
}
95
répondu kael 2018-07-24 20:22:10
la source

Autres questions sur