ข้อควรสนใจ: การสนับสนุนการเลิกใช้ Java 8+ API (Android Gradle Plugin 4.0.0+)
การพัฒนาในห้องสมุดนี้ ( ThreeTenABP ) กำลังคดเคี้ยว โปรดพิจารณาเปลี่ยนเป็นปลั๊กอิน Android Gradle 4.0, java.time. *, และฟีเจอร์การดึงข้อมูลไลบรารีหลักในอีกไม่กี่เดือนข้างหน้า
ในการเปิดใช้งานการรองรับ API ภาษาเหล่านี้ในแพลตฟอร์ม Android ทุกรุ่นให้อัพเดตปลั๊กอิน Android เป็น 4.0.0 (หรือสูงกว่า)และรวมสิ่งต่อไปนี้ในไฟล์ build.gradle ของโมดูลของคุณ:
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'
}
การค้นพบครั้งแรก: ทำไมคุณต้องใช้ThreeTenABPแทนjava.time , ThreeTen-Backportหรือแม้แต่Joda-Time
นี่เป็นรุ่นสั้น ๆ ของกระบวนการที่ยาวมากของการกำหนดมาตรฐานใหม่ แพคเกจทั้งหมดเหล่านี้มีลักษณะเหมือนกันมาก: ไลบรารีที่มีฟังก์ชันการจัดการเวลาที่ดีและทันสมัยสำหรับ Java ความแตกต่างนั้นบอบบาง แต่สำคัญ
ทางออกที่ชัดเจนที่สุดคือการใช้java.time
แพ็คเกจในตัวเนื่องจากนี่เป็นวิธีมาตรฐานใหม่ในการจัดการกับเวลาและวันที่ใน Java เป็นการใช้งานของJSR 310ซึ่งเป็นข้อเสนอมาตรฐานใหม่สำหรับการจัดการเวลาตามไลบรารีJoda-Time
อย่างไรก็ตามjava.time
เป็นที่รู้จักในJava 8 Android จนถึงMarshmallowทำงานบน Java 7 ("Android N" เป็นรุ่นแรกที่แนะนำคุณสมบัติภาษา Java 8) ดังนั้นเว้นแต่คุณจะกำหนดเป้าหมายเฉพาะAndroid N Nougatขึ้นไปคุณไม่สามารถพึ่งพาคุณสมบัติภาษา Java 8 ได้ (ฉันไม่แน่ใจว่านี่เป็นจริง 100% แต่นี่เป็นวิธีที่ฉันเข้าใจ) ดังนั้นjava.time
จะออก
ตัวเลือกถัดไปอาจเป็นJoda-Timeเนื่องจากJSR 310อิงตาม Joda-Time อย่างไรก็ตามตามที่ThreeTenABP readmeระบุด้วยเหตุผลหลายประการ Joda-Time ไม่ใช่ตัวเลือกที่ดีที่สุด
ถัดไปคือThreeTen-Backportซึ่งแบ็คพอร์ตส่วนใหญ่ (แต่ไม่ใช่ทั้งหมด) ของjava.time
ฟังก์ชันการทำงานของ Java 8 ไปเป็น Java 7 ซึ่งเป็นสิ่งที่ดีสำหรับกรณีการใช้งานส่วนใหญ่ แต่ตามที่ระบุในThreeTenABP readmeนั้นมีปัญหาประสิทธิภาพการทำงานกับ Android
ดังนั้นที่ผ่านมาและถูกต้องที่ดูเหมือนจะเป็นตัวเลือกที่ThreeTenABP
การค้นพบที่สอง: สร้างเครื่องมือและการจัดการการพึ่งพา
เนื่องจากการรวบรวมโปรแกรม - โดยเฉพาะอย่างยิ่งที่ใช้ไลบรารีภายนอกหลาย ๆ อันนั้นซับซ้อน Java แทบจะใช้"เครื่องมือสร้าง"เพื่อจัดการกระบวนการอย่างสม่ำเสมอ Make , Apache Ant , Apache MavenและGradleเป็นเครื่องมือสร้างทั้งหมดที่ใช้กับโปรแกรม Java (ดูบทความนี้เพื่อเปรียบเทียบ Gradle เป็นเครื่องมือสร้างที่เลือกไว้สำหรับโครงการ Android
เครื่องมือสร้างเหล่านี้รวมถึงการจัดการการพึ่งพา Apache Maven ดูเหมือนจะเป็นคนแรกที่รวมที่เก็บแพคเกจส่วนกลาง Maven แนะนำMaven Central Repositoryซึ่งอนุญาตให้ใช้งานได้เทียบเท่า php composer
กับ Packagist และ Ruby gem
ด้วย rubygems.org กล่าวอีกนัยหนึ่ง Maven Central Repository คือ Maven (และ Gradle) สิ่งที่นักแพ็กเกจใช้ในการแต่งเพลง - แหล่งข้อมูลที่แน่นอนและปลอดภัยสำหรับแพ็คเกจเวอร์ชัน
การค้นพบที่สาม: Gradle จัดการการพึ่งพาในโครงการ Android
สูงในรายการที่ต้องทำของฉันคือการอ่านเอกสาร Gradle ที่นี่รวมถึง eBooks ฟรีของพวกเขา ถ้าฉันได้อ่านเมื่อหลายสัปดาห์ก่อนตอนนี้ฉันเริ่มเรียนรู้เกี่ยวกับ Android ฉันรู้ว่า Gradle สามารถใช้ Maven Central Repository เพื่อจัดการการอ้างอิงในโครงการ Android ยิ่งไปกว่านั้นตามรายละเอียดในคำตอบ StackOverflow นี้ในขณะที่ Android Studio 0.8.9, Gradle ใช้ Maven Central Repository โดยปริยายผ่าน JCenter ของ Bintray ซึ่งหมายความว่าคุณไม่ต้องทำการตั้งค่าเพิ่มเติมใด ๆ เพื่อตั้งค่า repo - เพียงแค่แสดงรายการ การอ้างอิง
การค้นพบที่สี่: การอ้างอิงโครงการแสดงอยู่ใน [project dir] /app/build.gradle
ชัดเจนอีกครั้งสำหรับผู้ที่มีประสบการณ์ในการใช้ Gradle ใน Java แต่ใช้เวลาสักครู่กว่าจะเข้าใจสิ่งนี้ หากคุณเห็นคนพูดว่า "โอ้แค่เพิ่มcompile 'this-or-that.jar'
" หรือสิ่งที่คล้ายกันรู้ว่าcompile
เป็นคำสั่งในไฟล์ build.gradle ที่บ่งบอกถึงการพึ่งพาเวลารวบรวม นี่คือหน้า Gradle อย่างเป็นทางการเกี่ยวกับการจัดการการพึ่งพา
การค้นพบที่ห้า: ThreeTenABP บริหารโดย Jake Wharton ไม่ใช่โดย ThreeTen
อีกปัญหาหนึ่งที่ฉันใช้เวลาในการหาข้อมูลมากเกินไป ถ้าคุณมองหา ThreeTen ใน Maven กลางคุณจะเห็นเฉพาะแพคเกจสำหรับไม่threetenbp
threetenabp
หากคุณไปที่repit GitHub สำหรับ ThreeTenABPคุณจะเห็นcompile 'this-or-that'
บรรทัดที่น่าอับอายที่อยู่ใต้ส่วนดาวน์โหลดของ Readme
เมื่อฉันตี repo github ครั้งแรกฉันไม่รู้ว่าบรรทัดการคอมไพล์นั้นมีความหมายอย่างไรและฉันพยายามเรียกใช้ในเทอร์มินัลของฉัน (ด้วยความล้มเหลวที่ชัดเจนและคาดเดาได้) ผิดหวังฉันไม่ได้กลับไปจนกว่าจะคิดหาที่เหลือและในที่สุดก็รู้ว่ามันเป็นบรรทัด Maven Repo ชี้ไปที่com.jakewharton.threetenabp
repo ซึ่งตรงข้ามกับorg.threeten
repo นั่นเป็นเหตุผลที่ฉันคิดว่าแพ็คเกจ ThreeTenABP ไม่ได้อยู่ใน Maven repo
สรุป: ทำให้มันใช้งานได้
ตอนนี้มันดูเหมือนง่ายมาก คุณสามารถรับฟังก์ชั่นการจัดการเวลาที่ทันสมัยในโครงการ Android ด้วยการทำให้แน่ใจว่า[project folder]/app/build.gradle
ไฟล์ของคุณมีimplementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'
บรรทัดใน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'
}
เพิ่มไปยังระดับแอปพลิเคชันด้วย:
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
AndroidThreeTen.init(this);
//...
}
}