Android Project'te ThreeTenABP nasıl kullanılır


193

Bu soruyu soruyorum çünkü Java ve Android'de yeniyim ve bunu anlamaya çalışmak için saatlerce araştırdım. Cevap, ilgili cevapların bir kombinasyonundan geldi, bu yüzden mücadele eden herkes için öğrendiklerimi belgeleyeceğimi düşündüm. Cevaba bakınız.

Android Studio 2.1.2 kullanıyorum ve Java kurulumum şu:

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

Yanıtlar:


192

Dikkat: Java 8+ API desugaring desteği (Android Gradle Plugin 4.0.0+)

Bu kütüphane ( ThreeTenABP ) üzerinde gelişme yavaşlıyor . Lütfen önümüzdeki aylarda Android Gradle eklentisi 4.0, java.time. * Ve temel kütüphane desugaring özelliğine geçmeyi düşünün.

Bu dil API'lerinin Android platformunun herhangi bir sürümünde desteğini etkinleştirmek için Android eklentisini 4.0.0 (veya daha yüksek) sürümüne güncelleyin ve modülünüzün build.gradle dosyasına şunları ekleyin:

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'
}

İlk Keşif: Neden java.time , ThreeTen-Backport ve hatta Joda-Time Yerine ThreeTenABP Kullanmalısınız ?

Bu yeni bir standart tanımlama ÇOK UZUN SÜRECİN gerçekten kısa bir versiyonudur. Tüm bu paketler hemen hemen aynı şeydir: Java için iyi, modern zaman işleme işlevselliği sağlayan kütüphaneler. Farklılıklar ince ama önemlidir.

En açık çözüm yerleşik java.timepaketi kullanmak olacaktır , çünkü bu, Java'daki zaman ve tarihlerle başa çıkmanın yeni standart yoludur. Joda-Time kütüphanesine dayanan zaman işleme için yeni bir standart teklif olan JSR 310'un bir uygulamasıdır .

Ancak, Java 8'dejava.time tanıtıldı . Marshmallow'a kadar Android , Java 7'de çalışır ("Android N", Java 8 dil özelliklerini tanıtan ilk sürümdür). Bu nedenle, yalnızca Android N Nougat ve üstünü hedeflemezseniz , Java 8 dil özelliklerine güvenemezsiniz (aslında bunun% 100 doğru olduğundan emin değilim, ancak bunu anlıyorum). Öyleyse çıktı.java.time

Bir sonraki seçenek olabilir Joda-Time beri, JSR 310 Joda-Time dayanıyordu. Ancak, ThreeTenABP benioku dosyasının belirttiği gibi, birkaç nedenden dolayı Joda-Time en iyi seçenek değildir.

Sonraki, Java 8 işlevselliğinin çoğunu (ancak hepsini değil) Java 7'ye geri taşıyan ThreeTen-Backport'turjava.time . Bu, çoğu kullanım durumu için iyidir, ancak ThreeTenABP benioku dosyasında belirtildiği gibi Android ile performans sorunları vardır.

Yani son ve görünüşte doğru seçenek ThreeTenABP .

İkinci Keşif: Derleme Araçları ve Bağımlılık Yönetimi

Bir programı, özellikle de bir grup harici kütüphaneyi kullanarak derlemek karmaşık olduğundan, Java işlemi yönetmek için neredeyse her zaman bir "oluşturma aracı" kullanır . Make , Apache Ant , Apache Maven ve Gradle , Java programlarında kullanılan derleme araçlarıdır ( karşılaştırmalar için bu gönderiye bakın ). Daha sonra belirtildiği gibi, Gradle Android projeleri için seçilen derleme aracıdır.

Bu oluşturma araçları bağımlılık yönetimini içerir. Apache Maven, merkezi bir paket deposunu içeren ilk kişi gibi görünüyor. Maven , Packagist ile php'lere ve rubygems.org ile Ruby's'e eşdeğer işlevsellik sağlayan Maven Central Repository'yi tanıttı. Diğer bir deyişle, Maven Merkez Deposu, Packagegist'in besteleyeceği Maven (ve Gradle) 'dir - sürümlü paketler için kesin ve güvenli bir kaynaktır.composergem

Üçüncü Keşif: Gradle, Android Projelerindeki Bağımlılıkları Ele Alır

Yapılacaklar listemde öne çıkanlar , ücretsiz e-Kitaplar da dahil olmak üzere Gradle belgelerini burada okumaktır . Bu haftalar önce Android öğrenmeye başladığımda okumuş olsaydım, Gradle'ın Maven Central Repository'yi Android Projelerinde bağımlılıkları yönetmek için kullanabileceğini kesinlikle biliyordum. Ayrıca, bu StackOverflow yanıtında ayrıntılı olarak açıklandığı gibi, Android Studio 0.8.9'dan itibaren Gradle, Maven Central Repository'yi Bintray'ın JCenter'ı üzerinden dolaylı olarak kullanıyor; bağımlılıkları.

Dördüncü Keşif: Proje Bağımlılıkları [project dir] /app/build.gradle'de listelenmiştir

Yine, Gradle'ı Java'da kullanma konusunda deneyimi olanlar için açık, ama bunu anlamak biraz zaman aldı. "Oh, sadece ekleyin compile 'this-or-that.jar'" veya benzer bir şey söyleyen insanlar görürseniz compile, derleme zamanı bağımlılıkları gösteren o build.gradle dosyasında bir yönerge olduğunu bilin. İşte bağımlılık yönetimiyle ilgili resmi Gradle sayfası.

Beşinci Keşif: ThreeTenABP Jake Wharton tarafından yönetilir, ThreeTen tarafından yönetilmez

Yine başka bir konu anlamak için çok zaman harcadım. Maven'in Central ThreeTen için bakarsanız, yalnızca paketleri göreceksiniz threetenbpdeğil threetenabp. ThreeTenABP için github repo'ya giderseniz , Beni Oku'nuncompile 'this-or-that' İndir bölümünün altında o rezil çizgiyi göreceksiniz .

Bu github deposunu ilk vurduğumda, bu derleme satırının ne anlama geldiğini bilmiyordum ve terminalimde (açık ve tahmin edilebilir bir başarısızlıkla) çalıştırmaya çalıştım. Hayal kırıklığına uğramış, geri kalanını anladıktan sonra uzun süre geri dönmedim ve nihayet com.jakewharton.threetenabprepoya karşılık repoya işaret eden bir Maven Repo hattı olduğunu fark ettim org.threeten. Bu yüzden ThreeTenABP paketinin Maven deposunda olmadığını düşündüm.

Özet: İşe yaraması

Şimdi her şey oldukça kolay görünüyor. [project folder]/app/build.gradleDosyanızın bölümünde implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'satır olduğundan emin olarak bir Android projesinde modern zaman işleme işlevlerine sahip olabilirsiniz dependencies:

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'
}

Bunu Uygulama sınıfına da ekleyin:

public class App extends Application {    
    @Override
    public void onCreate() {
        super.onCreate();
        AndroidThreeTen.init(this);
        //...
    }
}

1
Harika gönderi için teşekkürler. Ancak, JodaTimeAndroid'i de dikkate alıp almadığınızı merak ediyorum .
Bob

@Bob, JodaTimeAndroid ile deneme yapmadım, ancak şu anda bunu gerektiren hiçbir şey üzerinde çalışmıyorum. Hatırladığım kadarıyla, java.timeuygulama iyiydi (temel olarak JodaTime'nin bir limanı olmak) ve eminim ki bir iki yıl içinde kullanıcıların% 90'ı Nougat + 'da olacak ve bu da geliştirme için uygun bir çözüm olacak.
kael

2
@Bob, JodaTime temelde JSR-310 ile aynıdır (temelde aynı adamlar tarafından bile yapılır), ancak JSR-310'un daha az tasarım kusuru olması söz konusudur ( örneğin bu makaleye bakın ). [... aşağıda devam etti]
M. Prokhorov

2
Yorumları netleştirmek için ... Java.time çerçevesi ( JSR 310 ) Joda-Time projesinin resmi halefidir . Her iki projeye de aynı adam Stephen Colebourne başkanlık ediyor . Joda-Time projesi şu anda bakım modunda ve ekip java.time'a geçişi tavsiye ediyor.
Basil Bourque

6
Emin aramak olun AndroidThreeTen.init(this), örneğin, API kullanarak önce onCreate().Sağlıklı Android'de ThreeTen-backport hatası - ZoneRulesException: Hayır saat dilimi veri dosyaları kayıtlı .
Ole VV

5

Kael tarafından kabul edilen cevap doğrudur. Ayrıca, birkaç şeyden bahsedeceğim ve java.time işlevselliği edinme hakkında bir diyagram sunacağım .

java.time Android 26 ve daha yeni sürümleri

Hedeflemesi Android'i 26 ya da geç, bir uygulamasını bulacaksınız JSR 310 ( java.time Android ile birlikte sınıfları). ThreeTenABP eklemenize gerek yok .

API'ler neredeyse aynı

Açıklığa kavuşturmak gerekirse , Android için ThreeTenABP , java.time işlevlerinin çoğunu Java 6 ve Java 7'ye getiren ThreeTen-Backport kütüphanesinin bir uyarlamasıdır . Bu arka bağlantı noktası java.time ile neredeyse aynı bir API'yi paylaşır .

Şimdi Android'i 26'dan daha önce hedeflediğinizi varsayalım, bu nedenle ThreeTenABP'yi kullanıyorsunuz . Daha sonra, Android ile birlikte gelen java.time sınıflarını kullanmak için nihayetinde Android'in bu önceki sürümleri için destek bırakabilirsiniz . Bu olduğunda, kod tabanınızda (a) anahtarlama importifadeleri dışında birkaç değişiklik yapmanız ve (b) org.threeten.bp.DateTimeUtilseski eski tarih-saat sınıflarına eklenen yeni dönüşüm yöntemlerini ( Date, GregorianCalendar) kullanmak için yaptığınız tüm aramaları değiştirme ( , ) .

Geçiş işlemi ThreeTenABP için java.time pürüzsüz ve yaklaşık ağrısız olmalıdır.

Hangi çerçevenin ne zaman kullanılması

İşte üç çerçeveyi gösteren ve hangisinin hangi senaryolarda ne zaman kullanılacağını gösteren bir grafik.

➥ Güncelleme: Android Gradle Plugin 4.0.0+ yeni bir 4. seçenek getiriyor, API önceki sürümde yerleşik olmayan java.time işlevselliğinin bir alt kümesini kullanıma sunmak için . Üst Bkz ana Yanıt kael tarafından.

Hangi Java veya Android sürümüyle kullanılacak java.time kütüphanesinin tablosu


Hakkında java.time

Java.time çerçevesi daha sonra Java 8 ve yerleşiktir. Bu sınıflar zahmetli eski yerini mirası gibi tarih-saat sınıfları java.util.Date, Calendar& SimpleDateFormat.

Daha fazla bilgi için Oracle Eğiticisine bakın . Ve birçok örnek ve açıklama için Stack Overflow'da arama yapın. Spesifikasyon JSR 310'dur .

Artık bakım modunda olan Joda-Time projesi java.time sınıflarına geçişi tavsiye ediyor .

Sen değiştirebilir java.time sizin veritabanı ile doğrudan nesneleri. JDBC 4.2 veya sonraki bir sürümüyle uyumlu bir JDBC sürücüsü kullanın . Dizeye gerek yok, sınıflara gerek yok . Hazırda Bekletme 5 ve JPA 2.2 java.time'ı destekler .java.sql.*

Java.time sınıflarını nereden edinebilirsiniz?


4

Android Studio'daki derleme sınıf dosyanızda aşağıdakileri ekleyin.

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

Application sınıfını oluşturun ve şu şekilde başlatın:

class App : Application() {
    override fun onCreate() {
        super.onCreate()
        AndroidThreeTen.init(this)
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.