Cara menggunakan ThreeTenABP di Android Project

193

Saya mengajukan pertanyaan ini karena saya baru di Jawa dan Android dan saya mencari berjam-jam untuk mencari tahu. Jawabannya datang dari kombinasi jawaban terkait, jadi saya pikir saya akan mendokumentasikan apa yang saya pelajari untuk orang lain yang mungkin sedang berjuang. Lihat jawaban.

Saya menggunakan Android Studio 2.1.2 dan pengaturan Java saya adalah sebagai berikut:

>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)
kael
sumber

Jawaban:

192

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.timepaket 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.timediperkenalkan 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.timejuga 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.timeke 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 composerdengan Packagist dan Ruby gemdengan 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 compileadalah 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.threetenabprepo, sebagai lawan dari org.threetenrepo. 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.gradlefile Anda memiliki implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'garis di dependenciesbagiannya:

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);
        //...
    }
}
kael
sumber
1
Terima kasih untuk posting yang bagus. Namun, saya bertanya-tanya apakah Anda telah mempertimbangkan JodaTimeAndroid juga.
Bob
@ Bob, saya belum bereksperimen dengan JodaTimeAndroid, tetapi hanya karena saya tidak benar-benar mengerjakan apa pun sekarang yang membutuhkannya. Dari yang saya ingat, java.timeimplementasinya 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.
kael
2
@ Bob, JodaTime pada dasarnya sama dengan JSR-310 (bahkan pada dasarnya dibuat oleh orang yang sama), kecuali JSR-310 yang diduga memiliki kekurangan desain yang lebih sedikit (lihat artikel ini , misalnya). [... berlanjut di bawah ini]
M. Prokhorov
2
Untuk memperjelas komentar ... Kerangka java.time ( JSR 310 ) adalah penerus resmi untuk proyek Joda-Time . Kedua proyek dipimpin oleh orang yang sama, Stephen Colebourne . Proyek Joda-Time sekarang dalam mode pemeliharaan, dengan tim menyarankan migrasi ke java.time.
Basil Bourque
6
Pastikan Anda menelepon AndroidThreeTen.init(this)sebelum menggunakan API, misalnya dalam. onCreate()Lihat kesalahan ThreeTen-Backport di Android - ZoneRulesException: Tidak ada file data zona waktu yang terdaftar .
Ole VV
5

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) importpernyataan peralihan , dan (b) mengubah panggilan apa pun yang Anda buat org.threeten.bp.DateTimeUtilsuntuk 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.

Tabel mana perpustakaan java.time untuk digunakan dengan versi Java atau Android


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?

Basil Bourque
sumber
4

Tambahkan berikut ini dalam file gradle build Anda di Android Studio.

implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'

Buat kelas Aplikasi dan inisialisasi seperti ini:

class App : Application() {
    override fun onCreate() {
        super.onCreate()
        AndroidThreeTen.init(this)
    }
}
Richard Kamere
sumber