ThreeTenABP'yi Android Projesinde kullanma
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
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.time
Java'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.composer
gem
Üçü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 compile
sö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.threetenabp
repo 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.gradle
dosyanızın implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'
kendi dependencies
bö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);
//...
}
}
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 import
deyimleri ve (b) org.threeten.bp.DateTimeUtils
eski 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?
- Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 ve üzeri - Paket uygulama ile standart Java API'sinin parçası.
- Java 9, bazı küçük özellikler ve düzeltmeler ekler.
- Java SE 6 ve Java SE 7
- Java.time işlevlerinin çoğu, ThreeTen-Backport'ta Java 6 ve 7'ye geri taşınır .
- Android
- Java.time sınıflarının Android paket uygulamalarının sonraki sürümleri .
- Daha önceki Android (<26) için, ThreeTenABP projesi ThreeTen-Backport'u (yukarıda bahsedilmiştir) uyarlar . Bkz ... ThreeTenABP nasıl kullanılır .
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)
}
}