Perhatian: Java 8+ API desugaring support (Android Gradle Plugin 4.0.0+)
Pengembangan di perpustakaan ini ( ThreeTenABP ) sedang mereda. Silakan pertimbangkan untuk beralih ke plugin Android Gradle 4.0, java.time. *, Dan fitur desugaring pustaka intinya dalam beberapa bulan mendatang.
Untuk mengaktifkan dukungan untuk API bahasa ini pada versi platform Android apa pun, perbarui plugin Android ke 4.0.0 (atau lebih tinggi) dan sertakan yang berikut dalam file build.gradle modul Anda:
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'
}
Penemuan Pertama: Mengapa Anda Harus Menggunakan ThreeTenABP Daripada java.time , ThreeTen-Backport , atau bahkan Joda-Time
Ini adalah versi yang sangat singkat dari PROSES SANGAT PANJANG dalam mendefinisikan standar baru. Semua paket ini hampir sama: perpustakaan yang menyediakan fungsionalitas penanganan waktu yang baik dan modern untuk Java. Perbedaannya halus tetapi penting.
Solusi yang paling jelas adalah dengan menggunakan java.time
paket bawaan, karena ini adalah cara standar baru untuk menangani waktu dan tanggal di Jawa. Ini adalah implementasi JSR 310 , yang merupakan proposal standar baru untuk penanganan waktu berdasarkan perpustakaan Joda-Time .
Namun, java.time
diperkenalkan di Jawa 8 . Android hingga Marshmallow berjalan di Java 7 ("Android N" adalah versi pertama yang memperkenalkan fitur bahasa Java 8). Jadi, kecuali Anda hanya menargetkan Android N Nougat ke atas, Anda tidak dapat mengandalkan fitur bahasa Java 8 (Saya tidak benar-benar yakin ini 100% benar, tetapi ini adalah bagaimana saya memahaminya). Begitu java.time
juga keluar.
Opsi berikutnya mungkin Joda-Time , karena JSR 310 didasarkan pada Joda-Time. Namun, seperti yang ditunjukkan ThreeTenABP readme , karena sejumlah alasan, Joda-Time bukanlah pilihan terbaik.
Berikutnya adalah ThreeTen-Backport , yang melakukan back-port banyak (tapi tidak semua) dari fungsi Java 8 java.time
ke Java 7. Ini bagus untuk sebagian besar kasus penggunaan, tetapi, seperti yang ditunjukkan dalam readme ThreeTenABP , ia memiliki masalah kinerja dengan Android.
Jadi opsi terakhir dan tampaknya benar adalah ThreeTenABP .
Penemuan Kedua: Alat Bangun dan Manajemen Ketergantungan
Karena mengkompilasi sebuah program - terutama yang menggunakan banyak pustaka eksternal - sangat kompleks, Java hampir selalu menggunakan "alat bangun" untuk mengelola proses. Make , Apache Ant , Apache Maven , dan Gradle adalah semua alat bangun yang digunakan dengan program Java (lihat posting ini untuk perbandingan). Sebagaimana dicatat lebih jauh ke bawah, Gradle adalah alat bangun yang dipilih untuk proyek Android.
Alat bangun ini termasuk manajemen ketergantungan. Apache Maven tampaknya menjadi yang pertama memasukkan repositori paket terpusat. Maven memperkenalkan Maven Central Repository , yang memungkinkan fungsionalitas setara dengan php composer
dengan Packagist dan Ruby gem
dengan rubygems.org. Dengan kata lain, Repositori Pusat Maven adalah untuk Maven (dan Gradle) seperti apa yang dilakukan Packagist untuk komposer - sumber yang pasti dan aman untuk paket berversi.
Penemuan Ketiga: Gradle Menangani Ketergantungan dalam Proyek Android
Yang paling penting dalam daftar tugas saya adalah membaca dokumen Gradle di sini , termasuk eBuku gratis mereka. Seandainya saya membaca beberapa minggu yang lalu ketika saya mulai belajar Android, saya pasti tahu bahwa Gradle dapat menggunakan Maven Central Repository untuk mengelola dependensi dalam Proyek Android. Selain itu, sebagaimana dijelaskan dalam jawaban StackOverflow ini , pada Android Studio 0.8.9, Gradle menggunakan Maven Central Repository secara implisit melalui JCenter Bintray, yang berarti Anda tidak perlu melakukan konfigurasi tambahan untuk mengatur repo - Anda cukup mendaftar ketergantungan.
Penemuan Keempat: Ketergantungan Proyek Terdaftar di [dir proyek] / app/build.gradle
Sekali lagi, jelas bagi mereka yang memiliki pengalaman menggunakan Gradle di Jawa, tetapi butuh beberapa saat untuk mencari tahu. Jika Anda melihat orang mengatakan "Oh, tambahkan saja compile 'this-or-that.jar'
" atau sesuatu yang serupa, ketahuilah bahwa itu compile
adalah arahan dalam file build.gradle yang menunjukkan dependensi waktu kompilasi. Inilah halaman Gradle resmi tentang manajemen ketergantungan.
Penemuan Kelima: ThreeTenABP Dikelola oleh Jake Wharton, bukan oleh ThreeTen
Namun masalah lain saya menghabiskan terlalu banyak waktu mencari tahu. Jika Anda mencari ThreeTen di Maven Central, Anda hanya akan melihat paket threetenbp
, bukan threetenabp
. Jika Anda pergi ke repo github untuk ThreeTenABP , Anda akan melihat compile 'this-or-that'
garis terkenal itu di bawah bagian Unduh Readme.
Ketika saya pertama kali menekan repo github ini, saya tidak tahu apa artinya garis kompilasi, dan saya mencoba menjalankannya di terminal saya (dengan kegagalan yang jelas dan dapat diprediksi). Frustrasi, saya tidak kembali ke sana sampai lama setelah saya menemukan sisanya, dan akhirnya menyadari bahwa itu adalah garis Maven Repo yang menunjuk ke com.jakewharton.threetenabp
repo, sebagai lawan dari org.threeten
repo. Itu sebabnya saya pikir paket ThreeTenABP tidak ada dalam repo Maven.
Ringkasan: Membuatnya berfungsi
Sekarang semuanya tampak cukup mudah. Anda bisa mendapatkan fungsi penanganan waktu modern di proyek Android dengan memastikan [project folder]/app/build.gradle
file Anda memiliki implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'
garis di dependencies
bagiannya:
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'
}
Juga tambahkan ini ke kelas Aplikasi:
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
AndroidThreeTen.init(this);
//...
}
}