Cách sử dụng ThreeTenABP trong Android Project

200
kael 2016-08-13 06:36.

Tôi đang hỏi câu hỏi này bởi vì tôi là người mới sử dụng Java và Android và tôi đã tìm kiếm hàng giờ để cố gắng tìm ra điều này. Câu trả lời đến từ sự kết hợp của các câu trả lời liên quan, vì vậy tôi nghĩ rằng tôi sẽ ghi lại những gì tôi học được cho bất kỳ ai khác có thể đang gặp khó khăn. Xem câu trả lời.

Tôi đang sử dụng Android Studio 2.1.2 và thiết lập Java của tôi như sau:

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

3 answers

200
kael 2016-08-13 06:36.

Chú ý: Câu trả lời này, mặc dù đúng về mặt kỹ thuật, nhưng hiện đã lỗi thời

Hỗ trợ gỡ lỗi API Java 8+ hiện có sẵn thông qua Android Gradle Plugin 4.0.0+

(Xem thêm câu trả lời của Basil Bourque bên dưới )

Quá trình phát triển trên Thư viện ThreeTenABP sắp kết thúc. Vui lòng xem xét chuyển sang plugin Android Gradle 4.0, java.time. * Và tính năng gỡ rối 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 thông tin 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'
}

Câu trả lời gốc

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 QUÁ 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 đều giống nhau: các thư viện cung cấp chức năng xử lý thời gian hiện đại, tốt cho Java. Sự khác biệt là nhỏ nhưng quan trọng.

Giải pháp rõ ràng nhất sẽ là sử dụng java.timegó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 , 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 đến 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 của 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 của ngôn ngữ Java 8 (tôi thực sự không chắc điều này là đúng 100%, nhưng đây là cách tôi hiểu). Như vậy java.timelà khỏi.

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ư chỉ số 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 , hỗ trợ nhiều (nhưng không phải tất cả) java.timechức năng của Java 8 sang 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ư đã chỉ ra trong readme ThreeTenABP , nó có vấn đề về hiệu suất với Android.

Vì vậy, lựa chọn cuối cùng và có vẻ đúng là ThreeTenABP .

Khám phá thứ hai: Xây dựng các công cụ và quản lý sự phụ thuộc

Vì 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 nhiều thư viện bên ngoài - rất phức tạp, nên 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 MavenGradle đều là những 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 lựa chọn cho các dự án Android.

Các công cụ xây dựng này bao gồm quản lý sự phụ thuộc. Apache Maven dường như là người đầu tiên bao gồm một kho lưu trữ gói tập trung. Maven đã giới thiệu Maven Central Repository , cho phép chức năng tương đương với php composervới Packagist và Ruby gemvới rubygems.org. Nói cách khác, Maven Central Repository đối với Maven (và Gradle), Packagist là nhà soạn nhạc - một nguồn chắc chắn và an toàn cho các gói đã được phiên bản.

Khám phá thứ ba: Xử lý sự phụ thuộc Gradle trong các dự án Android

Điểm cao trong danh sách việc cần làm của tôi là đọc tài liệu Gradle ở đây , bao gồm cả sách điện tử miễn phí của họ. Nếu tôi đã đọc những tuần trước khi bắt đầu học Android, tôi chắc chắn đã biết rằng Gradle có thể sử dụng Kho lưu trữ trung tâm Maven để quản lý các phần phụ thuộc trong các 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 Maven hoàn toàn thông qua JCenter của Bintray, có nghĩa là bạn không phải thực hiện thêm bất kỳ cấu hình nào để thiết lập kho lưu trữ - bạn chỉ cần liệt kê sự phụ thuộc.

Khám phá thứ tư: Sự phụ thuộc của dự án được liệt kê trong [dự án dir] /app/build.gradle

Một lần nữa, hiển nhiên đối với những người có kinh nghiệm sử dụng Gradle trong Java, nhưng tôi đã mất một lúc để 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 điều gì đó tương tự, hãy biết rằng đó compilelà một chỉ thị trong tệp build.gradle đó chỉ ra sự phụ thuộc vào 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

Tuy nhiên, một vấn đề khác mà tôi đã dành quá nhiều thời gian để tìm ra. Nếu bạn tìm kiếm ThreeTen ở Maven Central, bạn sẽ chỉ thấy các gói cho threetenbpchứ không phải threetenabp. Nếu bạn truy cập github repo 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 repo github này, tôi không biết dòng biên dịch đó có nghĩa là gì và tôi đã cố gắng chạy nó trong thiết bị đầu cuối của mình (với một lỗi rõ ràng và có thể dự đoán được). Thất vọng, tôi đã không quay lại nó cho đến khi tôi tìm ra phần còn lại, và cuối cùng nhận ra rằng đó là một dòng Maven Repo trỏ đến com.jakewharton.threetenabprepo, trái ngược với org.threetenrepo. Đó là lý do tại sao tôi nghĩ rằng gói ThreeTenABP không có trong Maven repo.

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ể nhận 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.gradletệp của bạn có implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'dòng trong dependenciesphầ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'
}

Cũng thêm cái này vào lớp Ứng dụng:

public class App extends Application {    
    @Override
    public void onCreate() {
        super.onCreate();
        AndroidThreeTen.init(this);
        //...
    }
}
8
Basil Bourque 2020-05-05 14:35.

Câu trả lời được chấp nhận bởi kael là đúng. Ngoài ra, tôi sẽ đề cập đến một số điều và cung cấp một sơ đồ về việc có được chức năng java.time .

java.time được tích hợp trong Android 26+

Nếu nhắm mục tiêu Android 26 trở lên, bạn sẽ thấy việc triển khai JSR 310 ( các lớp java.time ) đi kèm với Android. Không cần thêm ThreeTenABP .

Các API gần giống nhau

Chỉ cần làm rõ, ThreeTenABP cho Android là một bản chuyển thể của thư viện ThreeTen-Backport mang hầu hết các chức năng java.time cho Java 6Java 7 . Cổng phía sau này chia sẻ một API gần như giống hệt nhau với java.time .

Giả sử bây giờ bạn đang nhắm mục tiêu Android sớm hơn 26, vì vậy bạn sử dụng ThreeTenABP . Sau đó, cuối cùng bạn có thể ngừng hỗ trợ cho các phiên bản Android cũ hơn này, để sử dụng các lớp java.time đi kèm với Android. Khi điều đó xảy ra, bạn cần thực hiện một số thay đổi đối với cơ sở mã của mình ngoài (a) importcâu lệnh chuyển đổi và (b) thay đổi bất kỳ lệnh gọi nào bạn đã thực hiện org.threeten.bp.DateTimeUtilsđể sử dụng các phương thức chuyển đổi mới đã được thêm vào các lớp ngày-giờ kế thừa cũ ( Date, GregorianCalendar) .

Quá trình chuyển đổi từ ThreeTenABP sang java.time sẽ diễn ra suôn sẻ và gần như không đau.

Khi nào sử dụng khuôn khổ nào

Đây là biểu đồ hiển thị ba khuôn khổ và cho biết khi nào sử dụng khuôn khổ nào trong các tình huống.

➥ Cập nhật: Android Gradle Plugin 4.0.0+ mang đến tùy chọn thứ 4 mới, gỡ lỗi API để cung cấp một tập hợp con của chức năng java.time không được tích hợp sẵn trong Android trước đó. Xem phần đầu của Câu trả lời chính của kael.


Giới thiệu về java.time

Khung java.time được tích hợp sẵn trong Java 8 trở lên. Những lớp học thay thế cái cũ phiền hà di sản lớp học ngày thời gian như java.util.Date, Calendar, & SimpleDateFormat.

Để tìm hiểu thêm, hãy xem Hướng dẫn Oracle . Và tìm kiếm Stack Overflow để có nhiều ví dụ và giải thích. Đặc điểm kỹ thuật là JSR 310 .

Các Joda thời gian dự án, bây giờ trong chế độ bảo trì , khuyên chuyển đổi sang các java.time lớp.

Bạn có thể trao đổi các đối tượng java.time trực tiếp với cơ sở dữ liệu của mình. Sử dụng trình điều khiển JDBC tương thích với JDBC 4.2 trở lên. Không cần chuỗi, không cần java.sql.*lớp. Hibernate 5 & JPA 2.2 hỗ trợ java.time .

Lấy các lớp java.time ở đâu?

5
Richard Kamere 2019-08-19 07:02.

Thêm phần sau vào tệp gradle bản dựng của bạn trong Android Studio.

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

Tạo lớp Ứng dụng và khởi tạo nó như sau:

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

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

Một thương hiệu kế thừa khác có được cuộc sống mới khi những người chủ mới của Black Opal có được Hội chợ thời trang

Một thương hiệu kế thừa khác có được cuộc sống mới khi những người chủ mới của Black Opal có được Hội chợ thời trang

Desiree Rogers, trái, và Cheryl Mayberry McKissack Chuyển sang, Fenty Beauty và Pat McGrath, có một đế chế làm đẹp mới do phụ nữ làm chủ đang trỗi dậy. Sau thương vụ mua lại mỹ phẩm Black Opal vào tháng 9, đội ngũ quyền lực của Giám đốc điều hành công ty Desiree Rogers và Chủ tịch Cheryl Mayberry McKissack đã thông báo mua lại thương hiệu làm đẹp tiên phong Fashion Fair từ người sáng lập Johnson Publishing Company (JPC).

Ngoài việc trở nên vô nghĩa, các bên bộc lộ giới tính giờ đây đã trở nên chết người

Ngoài việc trở nên vô nghĩa, các bên bộc lộ giới tính giờ đây đã trở nên chết người

Đối với những người có quá nhiều thời gian, tiệc tiết lộ giới tính là một cách thú vị để không cần áp đặt những định kiến ​​hạn chế lên thai nhi trước một đối tượng bạn bè giả vờ quan tâm một cách lịch sự. Tuy nhiên, việc chỉ dựa vào những chiếc bánh nướng có màu nhân tạo để biểu thị một tiếng hoo-ha hoặc một đứa trẻ đi tè đã trở nên xa xỉ trong các bậc cha mẹ trên Instagram.

Kirstjen Nielsen đang cố gắng đổi mới bản thân với tư cách là một người phụ nữ 'nói ra sự thật cho sức mạnh'

Kirstjen Nielsen đang cố gắng đổi mới bản thân với tư cách là một người phụ nữ 'nói ra sự thật cho sức mạnh'

Hôm thứ Tư, cựu Bộ trưởng An ninh Nội địa Kirstjen Nielsen vì một lý do nào đó đã được đưa ra một diễn đàn để phát biểu tại Hội nghị thượng đỉnh Những người phụ nữ quyền lực nhất của Fortune. Và có thể đoán trước được, người phụ nữ giám sát các nỗ lực (đang diễn ra) của chính quyền Trump nhằm chia cắt các gia đình ở biên giới đã sử dụng thời gian của mình như một cơ hội để tự bảo vệ mình và tự nhận mình là người — và hãy hít thở sâu ở đây — “đã nói sự thật với quyền lực.

Toyota Racing Development sẽ cho ra mắt Supra 3000GT Concept, Massive Wing vào tháng tới

Toyota Racing Development sẽ cho ra mắt Supra 3000GT Concept, Massive Wing vào tháng tới

Vì thế hệ mới nhất của chiếc xe điều chỉnh được yêu thích trên thế giới hiện đã có mặt tại đây, nên chỉ có điều kiện là Toyota Racing Development sẽ đưa phiên bản Supra thế hệ thứ năm sửa đổi của riêng mình đến SEMA vào tháng tới. Toyota đã cho chúng tôi một gợi ý về những gì sẽ xảy ra trong tuần này: một chiếc Concept GR Supra 3000GT hiện đại.

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Vụ kiện, nêu tên một số học khu, lập luận rằng dự luật "Không nói đồng tính" được ban hành gần đây của Florida "có hiệu quả im lặng và xóa bỏ học sinh và gia đình LGBTQ +"

Đường băng hạ cánh

Đường băng hạ cánh

Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Tôi ghét từ "tàu đắm". Mọi người cảm thấy thoải mái trong la bàn đạo đức của riêng mình, và khi làm như vậy, họ thấy mình vượt qua sự phán xét.

Language