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);
//...
}
}
java.time
implementasinya baik-baik saja (pada dasarnya adalah pelabuhan JodaTime), dan saya yakin bahwa dalam satu atau dua tahun lagi, 90% pengguna akan menggunakan Nougat +, menjadikannya solusi yang layak untuk pengembangan.AndroidThreeTen.init(this)
sebelum menggunakan API, misalnya dalam.onCreate()
Lihat kesalahan ThreeTen-Backport di Android - ZoneRulesException: Tidak ada file data zona waktu yang terdaftar .Jawaban yang diterima oleh kael benar. Selain itu, saya akan menyebutkan beberapa hal, dan memberikan diagram tentang mendapatkan fungsionalitas java.time .
java.time dibangun ke Android 26+
Jika menargetkan Android 26 atau lebih baru, Anda akan menemukan implementasi JSR 310 ( kelas java.time ) yang dibundel dengan Android. Tidak perlu menambahkan ThreeTenABP .
API hampir identik
Sekadar memperjelas, ThreeTenABP untuk Android adalah adaptasi dari pustaka ThreeTen-Backport yang membawa sebagian besar fungsi java.time ke Java 6 dan Java 7 . Port-belakang ini berbagi hampir API yang identik dengan java.time .
Misalkan Anda sekarang menargetkan Android lebih awal dari 26, jadi Anda menggunakan ThreeTenABP . Kemudian, Anda mungkin pada akhirnya menjatuhkan dukungan untuk versi Android yang lebih awal ini, untuk menggunakan kelas java.time yang dibundel dengan Android. Ketika itu terjadi, Anda perlu membuat beberapa perubahan pada basis kode Anda selain dari (a)
import
pernyataan peralihan , dan (b) mengubah panggilan apa pun yang Anda buatorg.threeten.bp.DateTimeUtils
untuk menggunakan metode konversi baru yang ditambahkan ke kelas lama tanggal waktu lama (Date
,GregorianCalendar
) .Proses transisi dari ThreeTenABP ke java.time harus lancar dan hampir tidak menyakitkan.
Kapan harus menggunakan kerangka mana
Berikut adalah bagan yang menunjukkan tiga kerangka kerja, dan menunjukkan kapan harus menggunakan yang mana di mana skenario.
➥ Pembaruan: Android Gradle Plugin 4.0.0+ menghadirkan opsi ke-4 baru, API yang ingin menyediakan subset fungsi java.time yang awalnya tidak dibangun di Android sebelumnya. Lihat bagian atas dari Jawaban utama oleh kael.
Tentang java.time
The java.time kerangka dibangun ke Jawa 8 dan kemudian. Kelas-kelas ini menggantikan tua merepotkan warisan kelas tanggal-waktu seperti
java.util.Date
,Calendar
, &SimpleDateFormat
.Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasi adalah JSR 310 .
Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke kelas java.time .
Anda dapat bertukar objek java.time secara langsung dengan database Anda. Gunakan driver JDBC yang sesuai dengan JDBC 4.2 atau yang lebih baru. Tidak perlu untuk string, tidak perlu untuk
java.sql.*
kelas. Hibernate 5 & JPA 2.2 mendukung java.time .Di mana mendapatkan kelas java.time?
sumber
Tambahkan berikut ini dalam file gradle build Anda di Android Studio.
Buat kelas Aplikasi dan inisialisasi seperti ini:
sumber