ThreeTenABP'yi Android Projesinde kullanma

Aug 12 2016

Bu soruyu soruyorum çünkü Java ve Android'de yeniyim ve bunu anlamaya çalışırken saatlerce aradım. Cevap, ilgili cevapların bir kombinasyonundan geldi, bu yüzden mücadele eden başka biri için öğrendiklerimi belgeleyeceğimi düşündüm. Cevabı görün.

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

>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

200 kael Aug 12 2016 at 23:36

Dikkat: Bu cevap teknik olarak doğru olsa da artık güncel değil

Java 8+ API desugaring desteği artık Android Gradle Plugin 4.0.0+ ile kullanılabilir

(Ayrıca Basil Bourque'un aşağıdaki cevabına bakınız )

ThreeTenABP Kitaplığı üzerindeki geliştirme yavaşlıyor . Lütfen önümüzdeki aylarda Android Gradle eklenti 4.0, java.time. * Ve onun temel kitaplık çözümleme özelliğine geçmeyi düşünün.

Android platformunun herhangi bir sürümünde bu dil API'leri için desteği etkinleştirmek için Android eklentisini 4.0.0'a (veya daha yüksek) güncelleyin ve modülünüzün build.gradle dosyasına aşağıdakileri 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'
}

Orijinal Cevap

İlk Keşif: Neden java.time , ThreeTen-Backport ve hatta Joda-Time Yerine ThreeTenABP Kullanmanız Gerekiyor

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

java.timeJava'da saat ve tarihlerle başa çıkmanın yeni standart yolu olduğu için en bariz çözüm yerleşik paketi kullanmak olacaktır . Joda-Time kitaplığına dayalı zaman yönetimi 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 olan Android , Java 7'de çalışır ("Android N", Java 8 dil özelliklerini sunan ilk sürümdür). Bu nedenle, yalnızca Android N Nougat ve üstünü hedeflemediğiniz sürece , Java 8 dil özelliklerine güvenemezsiniz (aslında bunun% 100 doğru olduğundan emin değilim, ama ben bunu böyle anlıyorum). Yani dışarıda.java.time

Bir sonraki seçenek Joda-Time olabilir , çünkü JSR 310 Joda-Time'ı temel alıyordu. Bununla birlikte, ThreeTenABP benioku'nun da belirttiği gibi, çeşitli nedenlerden dolayı Joda-Time en iyi seçenek değildir.

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

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

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

Bir programı derlemek - özellikle bir grup harici kitaplık kullanan biri - 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ıyla kullanılan derleme araçlarıdır ( karşılaştırmalar için bu gönderiye bakın ). Aşağıda belirtildiği gibi Gradle, Android projeleri için seçilen derleme aracıdır.

Bu derleme araçları, bağımlılık yönetimini içerir. Apache Maven, merkezi bir paket deposu içeren ilk kişi gibi görünüyor. Maven , Packagist ile php'lere ve rubygems.org ile Ruby'ye eşdeğer işlevselliğe izin veren Maven Merkezi Deposunu tanıttı. Başka bir deyişle, Maven Merkezi Depo, Maven (ve Gradle) için Packagist'in besteci için neyse, sürümlü paketler için kesin ve güvenli bir kaynaktır.composergem

Üçüncü Keşif: Gradle, Android Projelerindeki Bağımlılıkları Yönetiyor

Yapılacaklar listemin başında , ücretsiz e-Kitapları da dahil olmak üzere Gradle belgelerini okumak var . Bu haftalar önce Android öğrenmeye başladığımda okumuş olsaydım, Gradle'ın Android Projelerindeki bağımlılıkları yönetmek için Maven Merkezi Depoyu kullanabileceğini kesinlikle biliyordum. Ayrıca, bu StackOverflow yanıtında ayrıntılı olarak açıklandığı üzere , Android Studio 0.8.9'dan itibaren Gradle, Maven Central Repository'yi dolaylı olarak Bintray'in JCenter'i aracılığıyla kullanır, bu da depoyu kurmak için fazladan herhangi bir yapılandırma yapmanız gerekmediği anlamına gelir - sadece bağımlılıklar.

Dördüncü Keşif: Proje Bağımlılıkları [proje dizini] /app/build.gradle'da Listeleniyor

Yine, Gradle'ı Java'da kullanma deneyimi olanlar için çok açık, ancak bunu anlamam biraz zaman aldı. İnsanların "Oh, sadece ekle compile 'this-or-that.jar'" veya benzer bir şey compilesöylediğini görürseniz, bunun build.gradle dosyasında derleme zamanı bağımlılıklarını gösteren bir yönerge olduğunu bilin. Bağımlılık yönetimiyle ilgili resmi Gradle sayfası burada .

Beşinci Keşif: ThreeTenABP, ThreeTen tarafından değil, Jake Wharton tarafından yönetiliyor

Yine de çözmek için çok zaman harcadığım başka bir konu. Maven Central'da ThreeTen'i ararsanız, yalnızca paketlerini görürsünüz threetenbp, değil threetenabp. ThreeTenABP için github deposuna giderseniz , Benioku'nuncompile 'this-or-that' İndir bölümünün altında o rezil satırı göreceksiniz .

Bu github deposuna ilk girdiğimde, bu derleme satırının ne anlama geldiğini bilmiyordum ve onu terminalimde çalıştırmayı denedim (bariz ve öngörülebilir bir başarısızlıkla). Hayal kırıklığına uğradım, gerisini çözdükten çok sonra geri dönmedim ve sonunda bunun com.jakewharton.threetenabprepo yerine repoya işaret eden bir Maven Repo hattı olduğunu anladım org.threeten. Bu yüzden ThreeTenABP paketinin Maven deposunda olmadığını düşündüm.

Özet: Çalışmasını sağlamak

Şimdi her şey oldukça kolay görünüyor. Bir Android projesinde modern zaman işleme işlevlerini, [project folder]/app/build.gradledosyanızın implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'kendi dependenciesbölümünde satıra sahip olduğundan emin olarak elde edebilirsiniz :

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

Ayrıca bunu Uygulama sınıfına ekleyin:

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

Kael tarafından kabul edilen cevap doğrudur. Ek olarak, birkaç şeyden bahsedeceğim ve java.time işlevselliğinin elde edilmesiyle ilgili bir şema sunacağım .

Android 26 + 'da yerleşik java.time

Android 26 veya sonraki bir sürümü hedefliyorsanız, Android ile birlikte bir JSR 310 ( java.time sınıfları) uygulaması bulacaksınız . ThreeTenABP eklemenize gerek yok .

API'ler neredeyse aynı

Sadece netleştirmek için ThreeTenABP Android için bir uyarlamasıdır ThreeTen-backport çoğunu getiren kütüphaneye java.time işlevsellik Java 6 ve Java 7 . Bu arka bağlantı noktası, java.time ile neredeyse aynı API'yi paylaşır .

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

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çeve ne zaman kullanılır?

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

➥ Güncelleme: Android Gradle Eklentisi 4.0.0+, daha önceki Android'de yerleşik olmayan java.time işlevinin bir alt kümesini kullanıma sunmak için yeni bir 4. seçenek olan API tasarlama özelliğini getiriyor . Kael tarafından yazılan ana Cevabın üst kısmına bakın .


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 edinmek için Oracle Eğitimi'ne bakın . Ve birçok örnek ve açıklama için Stack Overflow'da arama yapın. Spesifikasyon JSR 310'dur .

Şu anda 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 üstü ile uyumlu bir JDBC sürücüsü kullanın . Dizelere gerek yok, derslere gerek yok . Hibernate 5 ve JPA 2.2 java.time'ı destekler .java.sql.*

Java.time derslerini nereden edinebilirim?

5 RichardKamere Aug 19 2019 at 00:02

Aşağıdakileri Android Studio'daki derleme gradle dosyanıza ekleyin.

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

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

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