Cara menggunakan ThreeTenABP di Proyek Android

Aug 12 2016

Saya menanyakan pertanyaan ini karena saya baru mengenal Java dan Android dan saya mencari berjam-jam mencoba untuk mencari tahu. Jawabannya berasal dari kombinasi jawaban terkait, jadi saya pikir saya akan mendokumentasikan apa yang saya pelajari untuk orang lain yang mungkin kesulitan. 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)

Jawaban

200 kael Aug 12 2016 at 23:36

Perhatian: Jawaban ini, meski secara teknis benar, sekarang sudah usang

Dukungan desugaring Java 8+ API sekarang tersedia melalui Android Gradle Plugin 4.0.0+

(Juga lihat jawaban Basil Bourque di bawah )

Pengembangan di Perpustakaan ThreeTenABP sedang mereda. Pertimbangkan untuk beralih ke Android Gradle plugin 4.0, java.time. *, Dan fitur desain pustaka intinya dalam beberapa bulan mendatang.

Untuk mengaktifkan dukungan untuk API bahasa ini pada semua versi platform Android, perbarui plugin Android ke 4.0.0 (atau lebih tinggi) dan sertakan yang berikut ini 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'
}

Jawaban Asli

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 untuk mendefinisikan standar baru. Semua paket ini kurang lebih sama: perpustakaan yang menyediakan fungsionalitas penanganan waktu modern yang baik untuk Java. Perbedaannya halus tapi penting.

Solusi paling jelas adalah dengan menggunakan java.timepaket bawaan, karena ini adalah cara standar baru untuk menangani waktu dan tanggal di Java. Ini adalah implementasi JSR 310 , yang merupakan proposal standar baru untuk penanganan waktu berdasarkan pustaka Joda-Time .

Namun, java.timediperkenalkan di Java 8 . Android hingga Marshmallow berjalan di Java 7 ("Android N" adalah versi pertama yang memperkenalkan fitur bahasa Java 8). Jadi, kecuali jika Anda hanya menargetkan Android N Nougat dan yang lebih baru, Anda tidak dapat mengandalkan fitur bahasa Java 8 (saya sebenarnya tidak yakin ini 100% benar, tetapi begitulah cara saya memahaminya). Jadi java.timekeluar.

Pilihan berikutnya mungkin Joda-Time , karena JSR 310 didasarkan pada Joda-Time. Namun, seperti yang ditunjukkan oleh readme ThreeTenABP , karena sejumlah alasan, Joda-Time bukanlah pilihan terbaik.

Berikutnya adalah ThreeTen-Backport , yang mem -port banyak (tapi tidak semua) java.timefungsionalitas Java 8 ke Java 7. Ini bagus untuk sebagian besar kasus penggunaan, tetapi, seperti yang ditunjukkan dalam readme ThreeTenABP , ini memiliki masalah kinerja dengan Android.

Jadi opsi terakhir dan yang tampaknya benar adalah ThreeTenABP .

Penemuan Kedua: Build Tools dan Dependency Management

Karena mengompilasi program - terutama program yang menggunakan sekumpulan pustaka eksternal - itu rumit, Java hampir selalu menggunakan "build tool" untuk mengelola prosesnya. Make , Apache Ant , Apache Maven , dan Gradle adalah semua fitur build yang digunakan dengan program Java (lihat postingan ini untuk perbandingan). Sebagaimana dijelaskan lebih lanjut, Gradle adalah alat build yang dipilih untuk proyek Android.

Alat build ini mencakup manajemen ketergantungan. Apache Maven tampaknya menjadi yang pertama menyertakan repositori paket terpusat. Maven memperkenalkan Maven Central Repository , yang memungkinkan fungsionalitas yang setara dengan php composerdengan Packagist dan Ruby gemdengan rubygems.org. Dengan kata lain, Maven Central Repository adalah untuk Maven (dan Gradle) seperti Packagist bagi komposer - sumber yang pasti dan aman untuk paket berversi.

Penemuan Ketiga: Gradle Menangani Dependensi di Proyek Android

Yang paling penting dari daftar tugas saya adalah membaca dokumen Gradle di sini , termasuk eBook gratis mereka. Seandainya saya membaca beberapa minggu yang lalu ketika saya mulai belajar Android, saya pasti sudah tahu bahwa Gradle dapat menggunakan Maven Central Repository untuk mengelola dependensi di Android Projects. Selanjutnya, seperti yang dijelaskan dalam jawaban StackOverflow ini , mulai Android Studio 0.8.9, Gradle menggunakan Maven Central Repository secara implisit melalui Bintray's JCenter, yang berarti Anda tidak perlu melakukan konfigurasi tambahan untuk menyiapkan repo - Anda cukup mencantumkan ketergantungan.

Penemuan Keempat: Dependensi Proyek Terdaftar di [project dir] /app/build.gradle

Sekali lagi, jelas bagi mereka yang memiliki pengalaman menggunakan Gradle di Java, tetapi saya butuh beberapa saat untuk mengetahuinya. Jika Anda melihat orang mengatakan "Oh, tambahkan saja compile 'this-or-that.jar'" atau yang serupa, ketahuilah bahwa itu compileadalah perintah dalam file build.gradle yang menunjukkan dependensi waktu kompilasi. Berikut halaman Gradle resmi tentang manajemen ketergantungan.

Penemuan Kelima: ThreeTenABP Dikelola oleh Jake Wharton, bukan oleh ThreeTen

Namun masalah lain yang saya habiskan terlalu banyak waktu untuk 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'baris terkenal itu di bawah bagian Unduh di Readme.

Ketika saya pertama kali menekan repo github ini, saya tidak tahu apa arti baris kompilasi itu, dan saya mencoba menjalankannya di terminal saya (dengan kegagalan yang jelas dan dapat diprediksi). Frustrasi, saya tidak kembali ke sana sampai lama setelah saya mengetahui sisanya, dan akhirnya menyadari bahwa itu adalah garis Repo Maven yang menunjuk ke com.jakewharton.threetenabprepo, bukan ke org.threetenrepo. Itu sebabnya saya pikir paket ThreeTenABP tidak ada di repo Maven.

Ringkasan: Membuatnya berhasil

Sekarang semuanya tampak sangat mudah. Anda bisa mendapatkan fungsi penanganan waktu modern dalam 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'
}

Tambahkan juga ini ke kelas Aplikasi:

public class App extends Application {    
    @Override
    public void onCreate() {
        super.onCreate();
        AndroidThreeTen.init(this);
        //...
    }
}
8 BasilBourque May 05 2020 at 07:35

Jawaban yang diterima oleh kael benar. Selain itu, saya akan menyebutkan beberapa hal, dan memberikan diagram tentang memperoleh fungsionalitas java.time .

java.time terintegrasi dengan 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

Hanya untuk memperjelas, ThreeTenABP untuk Android adalah adaptasi dari pustaka ThreeTen-Backport yang menghadirkan sebagian besar fungsionalitas java.time ke Java 6 dan Java 7 . Port belakang ini berbagi API yang hampir identik dengan java.time .

Misalkan Anda sekarang menargetkan Android lebih awal dari 26, jadi Anda menggunakan ThreeTenABP . Nanti, Anda mungkin akhirnya akan menghentikan dukungan untuk versi Android sebelumnya ini, untuk menggunakan kelas java.time yang dipaketkan dengan Android. Jika itu terjadi, Anda perlu membuat sedikit perubahan pada basis kode Anda selain (a) importpernyataan pengalihan , dan (b) mengubah panggilan apa pun yang Anda lakukan org.threeten.bp.DateTimeUtilsuntuk menggunakan metode konversi baru yang ditambahkan ke kelas tanggal-waktu lama ( Date, GregorianCalendar) .

Proses transisi dari ThreeTenABP ke java.time harus lancar dan hampir tidak menimbulkan rasa sakit.

Kapan menggunakan framework yang mana

Berikut adalah bagan yang menunjukkan tiga kerangka kerja, dan menunjukkan kapan harus menggunakan kerangka kerja yang mana.

➥ Pembaruan: Android Gradle Plugin 4.0.0+ menghadirkan opsi ke-4 baru, API yang menginginkan untuk menyediakan subset fungsionalitas java.time yang awalnya tidak terpasang di Android sebelumnya. Lihat bagian atas 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. Spesifikasinya adalah JSR 310 .

Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke kelas java.time .

Anda dapat bertukar objek java.time langsung dengan database Anda. Gunakan driver JDBC yang sesuai dengan JDBC 4.2 atau yang lebih baru. Tidak perlu string, tidak perlu java.sql.*kelas. Hibernate 5 & JPA 2.2 mendukung java.time .

Di mana mendapatkan kelas java.time?

5 RichardKamere Aug 19 2019 at 00:02

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

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

Buat kelas Aplikasi dan lakukan inisialisasi seperti ini:

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