Chú ý: Hỗ trợ giải mã API Java 8+ (Plugin Android Gradle 4.0.0+)
Phát triển trên thư viện này ( ThreeTenABP ) đang đi xuống. Vui lòng xem xét chuyển sang plugin Android Gradle 4.0, java.time. * Và tính năng giải nén thư viện cốt lõi của nó trong những tháng tới.
Để bật hỗ trợ cho các API ngôn ngữ này trên bất kỳ phiên bản nào của nền tảng Android, hãy cập nhật plugin Android lên 4.0.0 (hoặc cao hơn) và bao gồm các phần sau trong tệp build.gradle của mô-đun của bạn:
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'
}
Khám phá đầu tiên: Tại sao bạn phải sử dụng ThreeTenABP thay vì java.time , ThreeTen-Backport hoặc thậm chí là Joda-Time
Đây là một phiên bản thực sự ngắn của QUY TRÌNH RẤT DÀI để xác định một tiêu chuẩn mới. Tất cả các gói này khá giống nhau: các thư viện cung cấp chức năng xử lý thời gian tốt, hiện đại cho Java. Sự khác biệt là tinh tế nhưng quan trọng.
Giải pháp rõ ràng nhất là sử dụng java.time
gói tích hợp, vì đây là cách tiêu chuẩn mới để xử lý thời gian và ngày tháng trong Java. Đây là một triển khai của JSR 310 , đây là một đề xuất tiêu chuẩn mới để xử lý thời gian dựa trên thư viện Joda-Time .
Tuy nhiên, java.time
đã được giới thiệu trong Java 8 . Android lên tới Marshmallow chạy trên Java 7 ("Android N" là phiên bản đầu tiên giới thiệu các tính năng ngôn ngữ Java 8). Do đó, trừ khi bạn chỉ nhắm mục tiêu Android N Nougat trở lên, bạn không thể dựa vào các tính năng ngôn ngữ Java 8 (Tôi thực sự không chắc chắn điều này đúng 100%, nhưng đây là cách tôi hiểu về nó). Thế java.time
là hết.
Tùy chọn tiếp theo có thể là Joda-Time , vì JSR 310 dựa trên Joda-Time. Tuy nhiên, như readme ThreeTenABP chỉ ra, vì một số lý do, Joda-Time không phải là lựa chọn tốt nhất.
Tiếp theo là ThreeTen-Backport , vốn hỗ trợ nhiều (nhưng không phải tất cả) java.time
chức năng Java 8 cho Java 7. Điều này tốt cho hầu hết các trường hợp sử dụng, nhưng, như đã nêu trong readme ThreeTenABP , nó có vấn đề về hiệu năng với Android.
Vì vậy, tùy chọn cuối cùng và có vẻ đúng là ThreeTenABP .
Khám phá thứ hai: Xây dựng công cụ và quản lý phụ thuộc
Do việc biên dịch một chương trình - đặc biệt là một chương trình sử dụng một loạt các thư viện bên ngoài - rất phức tạp, Java hầu như luôn sử dụng một "công cụ xây dựng" để quản lý quy trình. Make , Apache Ant , Apache Maven và Gradle đều là các công cụ xây dựng được sử dụng với các chương trình Java (xem bài đăng này để so sánh). Như đã lưu ý thêm, Gradle là công cụ xây dựng được chọn cho các dự án Android.
Những công cụ xây dựng này bao gồm quản lý phụ thuộc. Apache Maven dường như là người đầu tiên bao gồm kho lưu trữ gói tập trung. Maven giới thiệu Kho lưu trữ trung tâm Maven , cho phép chức năng tương đương với php composer
với Packagist và Ruby gem
với rubygems.org. Nói cách khác, Kho lưu trữ trung tâm Maven dành cho Maven (và Gradle) Packagist là gì đối với nhà soạn nhạc - một nguồn chính xác và an toàn cho các gói được phiên bản.
Khám phá thứ ba: Gradle Xử lý phụ thuộc trong các dự án Android
Cao trong danh sách việc cần làm của tôi là đọc các tài liệu Gradle ở đây , bao gồm cả ebook miễn phí của họ. Tôi đã đọc những tuần trước khi tôi bắt đầu học Android, tôi chắc chắn sẽ biết rằng Gradle có thể sử dụng Kho lưu trữ trung tâm Maven để quản lý các phụ thuộc trong Dự án Android. Hơn nữa, như chi tiết trong câu trả lời StackOverflow này , kể từ Android Studio 0.8.9, Gradle sử dụng Kho lưu trữ trung tâm của Maven thông qua JCenter của Bintray, có nghĩa là bạn không phải thực hiện bất kỳ cấu hình bổ sung nào để thiết lập repo - bạn chỉ cần liệt kê phụ thuộc.
Khám phá thứ tư: Phụ thuộc dự án được liệt kê trong [dir dự án] /app/build.gradle
Một lần nữa, rõ ràng với những người có bất kỳ kinh nghiệm sử dụng Gradle trong Java, nhưng tôi phải mất một thời gian để tìm ra điều này. Nếu bạn thấy mọi người nói "Ồ, chỉ cần thêm compile 'this-or-that.jar'
" hoặc một cái gì đó tương tự, hãy biết rằng đó compile
là một lệnh trong tệp build.gradle chỉ ra các phụ thuộc thời gian biên dịch. Đây là trang Gradle chính thức về quản lý phụ thuộc.
Khám phá thứ năm: ThreeTenABP được quản lý bởi Jake Wharton, không phải bởi ThreeTen
Một vấn đề khác tôi đã dành quá nhiều thời gian để tìm ra. Nếu bạn tìm ThreeTen trong Maven Central, bạn sẽ chỉ thấy các gói cho threetenbp
chứ không phảithreetenabp
. Nếu bạn đi đến repo github cho ThreeTenABP , bạn sẽ thấy compile 'this-or-that'
dòng khét tiếng đó trong phần Tải xuống của Readme.
Khi tôi lần đầu tiên nhấn vào repo github này, tôi không biết dòng biên dịch đó có nghĩa gì và tôi đã cố chạy nó trong thiết bị đầu cuối của mình (với một thất bại rõ ràng và có thể dự đoán được). Thất vọng, tôi đã không trở lại với nó cho đến khi tôi nhận ra phần còn lại, và cuối cùng nhận ra rằng đó là dòng Maven Repo chỉ vào com.jakewharton.threetenabp
repo, trái ngược với org.threeten
repo. Đó là lý do tại sao tôi nghĩ gói ThreeTenABP không có trong repo Maven.
Tóm tắt: Làm cho nó hoạt động
Bây giờ tất cả có vẻ khá dễ dàng. Bạn có thể có được các chức năng xử lý thời gian hiện đại trong một dự án Android bằng cách đảm bảo [project folder]/app/build.gradle
tệp của bạn có implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'
dòng trong dependencies
phần của nó :
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'
}
Đồng thời thêm phần này vào lớp Ứng dụng:
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
AndroidThreeTen.init(this);
//...
}
}