Atenção: Suporte para desugaring da API Java 8+ (Android Gradle Plugin 4.0.0+)
O desenvolvimento desta biblioteca ( ThreeTenABP ) está terminando. Por favor, considere mudar para o plugin Android Gradle 4.0, java.time. *, E seu principal recurso de remoção de biblioteca nos próximos meses.
Para ativar o suporte para essas APIs de idioma em qualquer versão da plataforma Android, atualize o plug-in Android para 4.0.0 (ou superior) e inclua o seguinte no arquivo build.gradle do seu 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'
}
Primeira descoberta: por que você precisa usar o ThreeTenABP em vez de java.time , ThreeTen-Backport ou até Joda-Time
Esta é uma versão realmente curta do PROCESSO MUITO LONGO de definir um novo padrão. Todos esses pacotes são praticamente a mesma coisa: bibliotecas que fornecem boas e modernas funcionalidades de manipulação de tempo para Java. As diferenças são sutis, mas importantes.
A solução mais óbvia seria usar o java.time
pacote interno, pois essa é a nova maneira padrão de lidar com a hora e as datas em Java. É uma implementação do JSR 310 , que era uma nova proposta padrão para manipulação de tempo com base na biblioteca Joda-Time .
No entanto, java.time
foi introduzido no Java 8 . O Android até Marshmallow é executado no Java 7 ("Android N" é a primeira versão a introduzir os recursos da linguagem Java 8). Portanto, a menos que você esteja direcionando apenas para o Android N Nougat e superior, não poderá confiar nos recursos da linguagem Java 8 (não tenho certeza se isso é 100% verdadeiro, mas é assim que entendo). Então java.time
está fora.
A próxima opção pode ser o Joda-Time , já que o JSR 310 foi baseado no Joda-Time. No entanto, como o leiame do ThreeTenABP indica, por vários motivos, o Joda-Time não é a melhor opção.
A seguir, está o ThreeTen-Backport , que fornece uma porta (mas não toda) da funcionalidade do Java 8 java.time
para o Java 7. Isso é bom para a maioria dos casos de uso, mas, conforme indicado no leia-me do ThreeTenABP , há problemas de desempenho com o Android.
Portanto, a última e aparentemente correta opção é ThreeTenABP .
Segunda descoberta: ferramentas de construção e gerenciamento de dependências
Como a compilação de um programa - especialmente um usando várias bibliotecas externas - é complexa, o Java quase invariavelmente usa uma "ferramenta de construção" para gerenciar o processo. Make , Apache Ant , Apache Maven e Gradle são ferramentas de construção que são usadas com programas Java (consulte esta publicação para comparações). Como observado mais abaixo, Gradle é a ferramenta de compilação escolhida para projetos Android.
Essas ferramentas de construção incluem gerenciamento de dependência. O Apache Maven parece ser o primeiro a incluir um repositório de pacotes centralizado. O Maven introduziu o Maven Central Repository , que permite funcionalidades equivalentes aos php's do composer
Packagist e Ruby's do gem
rubygems.org. Em outras palavras, o Maven Central Repository é para Maven (e Gradle) o que o Packagist é o compositor - uma fonte definitiva e segura para pacotes com versão.
Terceira descoberta: Gradle lida com dependências em projetos Android
No topo da minha lista de tarefas é ler os documentos da Gradle aqui , incluindo seus e-books gratuitos. Se eu tivesse lido essas semanas atrás, quando comecei a aprender Android, certamente saberia que Gradle pode usar o Repositório Central do Maven para gerenciar dependências em Projetos Android. Além disso, conforme detalhado nesta resposta do StackOverflow, no Android Studio 0.8.9, o Gradle usa o Maven Central Repository implicitamente através do JCenter da Bintray, o que significa que você não precisa fazer nenhuma configuração extra para configurar o repositório - basta listar o dependências.
Quarta descoberta: as dependências do projeto são listadas em [dir do projeto] /app/build.gradle
Mais uma vez, óbvio para quem tem alguma experiência com o Gradle em Java, mas demorei um pouco para descobrir isso. Se você vir pessoas dizendo "Ah, basta adicionar compile 'this-or-that.jar'
" ou algo semelhante, saiba que compile
é uma diretiva nesse arquivo build.gradle que indica dependências em tempo de compilação. Aqui está a página oficial da Gradle sobre gerenciamento de dependências.
Quinta descoberta: o ThreeTenABP é gerenciado por Jake Wharton, não pelo ThreeTen
Outra questão que eu gastei muito tempo tentando descobrir. Se você procurar o ThreeTen no Maven Central, verá apenas pacotes threetenbp
, não threetenabp
. Se você for ao repositório do github do ThreeTenABP , verá essa compile 'this-or-that'
linha infame na seção Download do Leia-me.
Quando cheguei a este repositório do github, não sabia o que significava essa linha de compilação e tentei executá-la no meu terminal (com uma falha óbvia e previsível). Frustrado, eu não voltei a ele até muito tempo depois que descobri o resto e finalmente percebi que é uma linha Maven Repo apontando para o com.jakewharton.threetenabp
repo, em oposição ao org.threeten
repo. Por isso, pensei que o pacote ThreeTenABP não estava no repositório Maven.
Resumo: Fazendo funcionar
Agora tudo parece bem fácil. Você pode obter funções modernas de manipulação de tempo em um projeto Android, certificando-se de que seu [project folder]/app/build.gradle
arquivo tenha a implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'
linha em sua dependencies
seção:
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'
}
Adicione isso também à classe Application:
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
AndroidThreeTen.init(this);
//...
}
}