एंड्रॉइड प्रोजेक्ट में थ्रीटेनबप का उपयोग कैसे करें


192

मैं यह सवाल पूछ रहा हूं क्योंकि मैं जावा और एंड्रॉइड के लिए नया हूं और मैंने इसे जानने के लिए घंटों खोज की। जवाब संबंधित उत्तरों के संयोजन से आया था, इसलिए मुझे लगा कि मैं किसी और के लिए जो कुछ भी संघर्ष कर रहा हूं, उसके बारे में सीखूंगा। उत्तर देखो।

मैं एंड्रॉइड स्टूडियो 2.1.2 का उपयोग कर रहा हूं और मेरा जावा सेटअप निम्नलिखित है:

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

जवाबों:


192

ध्यान दें: जावा 8+ एपीआई अवर समर्थन (एंड्रॉइड ग्रैडल प्लगिन 4.0.0+)

इस लाइब्रेरी ( थ्रीटेबैप ) का विकास कम हो रहा है। कृपया आने वाले महीनों में एंड्रॉइड ग्रैडल प्लगइन 4.0, java.time। *, और इसके मुख्य पुस्तकालय की सुविधा के लिए स्विच करने पर विचार करें।

एंड्रॉइड प्लेटफ़ॉर्म के किसी भी संस्करण पर इन भाषा एपीआई के लिए समर्थन को सक्षम करने के लिए, एंड्रॉइड प्लगइन को 4.0.0 (या उच्चतर) में अपडेट करें और अपने मॉड्यूल के बिल्ड.ग्रेडल फ़ाइल में निम्न शामिल करें:

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 समय

यह एक नए मानक को परिभाषित करने की बहुत लंबी प्रक्रिया का एक बहुत छोटा संस्करण है। ये सभी पैकेज बहुत समान हैं: लाइब्रेरी जो जावा के लिए अच्छी, आधुनिक समय की कार्यक्षमता प्रदान करती हैं। अंतर सूक्ष्म लेकिन महत्वपूर्ण हैं।

सबसे स्पष्ट समाधान अंतर्निहित java.timeपैकेज का उपयोग करना होगा , क्योंकि यह जावा में समय और तारीखों से निपटने का नया मानक तरीका है। यह JSR 310 का कार्यान्वयन है , जो कि समय -समय पर जोडा-टाइम लाइब्रेरी पर आधारित एक नया मानक प्रस्ताव था ।

हालाँकि, जावा 8java.time में पेश किया गया था । मार्शमैलो तक एंड्रॉइड जावा 7 पर चलता है ("एंड्रॉइड एन" जावा 8 भाषा सुविधाओं को पेश करने वाला पहला संस्करण है)। इस प्रकार, जब तक आप केवल Android N Nougat और इसके बाद के संस्करण को लक्षित नहीं कर रहे हैं , आप Java 8 भाषा सुविधाओं पर भरोसा नहीं कर सकते हैं (मुझे वास्तव में यकीन नहीं है कि यह 100% सच है, लेकिन यह है कि मैं इसे कैसे समझता हूं)। तो बाहर है।java.time

अगला विकल्प Joda-Time हो सकता है , क्योंकि JSR 310 Joda-Time पर आधारित था। हालांकि, जैसा कि थ्रीटेनेबप रेडमी इंगित करता है, कई कारणों से, जोडा-टाइम सबसे अच्छा विकल्प नहीं है।

इसके बाद थ्रीटेन-बैकपोर्ट है , जो जावा 7 की java.timeकार्यक्षमता का जावा 8 कार्यक्षमता का बहुत (लेकिन सभी नहीं) है । यह अधिकांश उपयोग के मामलों के लिए ठीक है, लेकिन, जैसा कि थ्रीटीनबप रीडमी में संकेत दिया गया है , इसमें एंड्रॉइड के साथ प्रदर्शन के मुद्दे हैं।

तो अंतिम और उचित रूप से सही विकल्प थ्रीटैनबप है

दूसरा डिस्कवरी: उपकरण और निर्भरता प्रबंधन बनाएँ

प्रोग्राम को संकलित करने के बाद से - विशेष रूप से बाहरी पुस्तकालयों के एक समूह का उपयोग करने वाला - जटिल है, जावा लगभग हमेशा प्रक्रिया का प्रबंधन करने के लिए "बिल्ड टूल" का उपयोग करता है । मेक , अपाचे चींटी , अपाचे मावेन और ग्रैडल सभी बिल्ड टूल्स हैं जो जावा प्रोग्राम के साथ उपयोग किए जाते हैं ( तुलना के लिए इस पोस्ट को देखें )। जैसा कि आगे बताया गया है, ग्रैडल एंड्रॉइड प्रोजेक्ट्स के लिए चुना गया बिल्ड टूल है।

इन बिल्ड टूल में निर्भरता प्रबंधन शामिल है। अपाचे मावेन एक केंद्रीकृत पैकेज रिपॉजिटरी को शामिल करने वाला पहला प्रतीत होता है। मावेन ने मावेन सेंट्रल रिपोजिटरी की शुरुआत की , जो कि composerपैकगिस्ट और रूबी के gemसाथ rubygems.org के साथ कार्यक्षमता के बराबर है । दूसरे शब्दों में, मावेन सेंट्रल रिपोजिटरी मावेन (और ग्रैडल) के लिए है जो पैक्सैगिस्ट संगीतकार के लिए है - संस्करण पैकेज के लिए एक निश्चित और सुरक्षित स्रोत है।

तीसरा डिस्कवरी: एंड्रॉइड प्रोजेक्ट्स में ग्रेड हैंडल निर्भरता

मेरी टू-डू सूची में उच्च ग्रेड ग्रैड डॉक्स को पढ़ना है , जिसमें उनके मुफ़्त ई-बुक्स शामिल हैं। अगर मैंने एंड्रॉइड सीखना शुरू कर दिया, तो मैंने इन हफ्तों में पढ़ा था, मुझे निश्चित रूप से पता होगा कि ग्रैडल एंड्रॉइड प्रोजेक्ट्स में निर्भरता का प्रबंधन करने के लिए मैवेन सेंट्रल रिपॉजिटरी का उपयोग कर सकता है। इसके अलावा, के रूप में में विस्तृत इस StackOverflow जवाब, एंड्रॉयड स्टूडियो 0.8.9 के रूप में, Gradle Maven केन्द्रीय भंडार का उपयोग करता परोक्ष Bintray के JCenter, जिसका अर्थ है आप रेपो स्थापित करने के लिए किसी भी अतिरिक्त config करने के लिए की जरूरत नहीं है के माध्यम से - तुम सिर्फ सूची निर्भरता।

चौथा डिस्कवरी: परियोजना निर्भरताएँ [परियोजना dir] /app/build.gradle में सूचीबद्ध हैं

फिर, उन लोगों के लिए स्पष्ट है जिनके पास जावा में ग्रेडल का उपयोग करने का कोई अनुभव है, लेकिन मुझे यह पता लगाने में थोड़ा समय लगा। यदि आप लोगों को "ओह, बस जोड़ compile 'this-or-that.jar'" या ऐसा ही कुछ कहते हुए देखते हैं , तो जानें कि compileउस बिल्ड.ग्रेड फ़ाइल में एक निर्देश है जो संकलन-समय की निर्भरता को इंगित करता है। यहाँ निर्भरता प्रबंधन पर आधिकारिक ग्रेड पेज है।

पांचवीं डिस्कवरी: थ्रीटेनबप इज जेक व्हार्टन द्वारा प्रबंधित, थ्रीटेन द्वारा नहीं

फिर भी एक और मुद्दा मैंने बहुत ज्यादा समय बिताया। यदि आप मावेन सेंट्रल में थ्रीटेन की तलाश करते हैं, तो आप केवल इसके लिए पैकेज देखेंगे threetenbp, नहीं threetenabp। यदि आप थ्रीटेबैप के लिए गिटब रेपो में जाते हैं , तो आप compile 'this-or-that'रीडमी के डाउनलोड अनुभाग के तहत उस बदनाम लाइन को देखेंगे ।

जब मैंने पहली बार इस गितुब रेपो को मारा, तो मुझे नहीं पता था कि उस संकलन लाइन का क्या मतलब है, और मैंने इसे अपने टर्मिनल में चलाने की कोशिश की (एक स्पष्ट और अनुमानित विफलता के साथ)। हताश होकर, मैं लंबे समय से जब तक यह करने के लिए वापस नहीं किया था के बाद मैं बाकी पता लगा, और अंत में महसूस किया कि यह एक Maven रेपो लाइन की ओर इशारा करते है com.jakewharton.threetenabpरेपो के रूप में करने का विरोध किया, org.threetenरेपो। इसलिए मुझे लगा कि थ्रीटेबैप पैकेज मावेन रेपो में नहीं था।

सारांश: यह काम कर रहा है

अब यह सब बहुत आसान लगता है। आप आधुनिक समय आपके सुनिश्चित करते हुए एक 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);
        //...
    }
}

1
बेहतरीन पोस्ट के लिए धन्यवाद। हालांकि, मुझे आश्चर्य है कि क्या आपने JodaTimeAndroid को भी माना है ।
बॉब

@ थोडा, मैंने JodaTimeAndroid के साथ प्रयोग नहीं किया है, लेकिन केवल इसलिए कि मैं वास्तव में अभी कुछ भी काम नहीं कर रहा हूँ जिसके लिए इसकी आवश्यकता है। मुझे जो याद है, वह java.timeकार्यान्वयन ठीक था (मूल रूप से JodaTime का एक बंदरगाह होने के नाते), और मुझे यकीन है कि एक और दो साल में, 90% उपयोगकर्ता Nougat + पर होंगे, जिससे यह विकास के लिए एक व्यवहार्य समाधान बन जाएगा।
kael

2
@ याकूब, जोडामेट मूल रूप से JSR-310 के समान है (मूल रूप से समान लोगों द्वारा बनाया गया है), JSR-310 को छोड़कर कम माना जाता है कि इसमें कम खामियां हैं ( उदाहरण के लिए यह लेख देखें )। [... नीचे जारी]
एम। प्रोखोरोव

2
टिप्पणियों को स्पष्ट करने के लिए ... java.time फ्रेमवर्क ( JSR 310 ) जोडा-टाइम परियोजना का आधिकारिक उत्तराधिकारी है । दोनों परियोजनाओं का नेतृत्व एक ही आदमी, स्टीफन कोलबोर्न कर रहे हैं । जोडा-टाइम परियोजना अब रखरखाव मोड में है, टीम ने java.time को प्रवास की सलाह दी है।
बेसिल बोर्के

6
सुनिश्चित करें कि आप AndroidThreeTen.init(this)API का उपयोग करने से पहले कॉल करते हैं, उदाहरण के लिए onCreate().See तीनTen-Backport त्रुटि Android पर - ZoneRulesException: कोई समय-क्षेत्र डेटा फ़ाइलें पंजीकृत नहीं
ओले वीवी

5

Kael द्वारा स्वीकृत उत्तर सही है। इसके अलावा, मैं कुछ चीजों का उल्लेख करूंगा, और java.time कार्यक्षमता प्राप्त करने के बारे में एक चित्र प्रदान करेगा ।

java.time Android 26+ में बनाया गया है

यदि एंड्रॉइड 26 या बाद में लक्षित किया जाता है , तो आपको एंड्रॉइड के साथ बंडल किए गए JSR 310 ( java.time कक्षाएं) का कार्यान्वयन मिलेगा । ThreeTenABP को जोड़ने की आवश्यकता नहीं है ।

एपीआई लगभग समान

बस स्पष्ट करने के लिए, एंड्रॉइड के लिए थ्रीटेनएबीपी थ्री टेन-बैकपोर्ट लाइब्रेरी का एक अनुकूलन है जो जावा 6 और जावा 7 में अधिकांश जावा.टाइम कार्यक्षमता लाता है । यह बैक-पोर्ट java.time के साथ लगभग समान एपीआई साझा करता है

मान लीजिए कि आप अब 26 से पहले एंड्रॉइड को लक्षित कर रहे हैं, इसलिए आप थ्रीटेनबप का उपयोग करते हैं । बाद में, आपका अंततः Android के इन पुराने संस्करणों के लिए समर्थन छोड़ सकता है, Android के साथ बंडल किए गए java.time कक्षाओं का उपयोग करने के लिए । जब ऐसा होता है, तो आपको (क) स्विचिंग importस्टेटमेंट्स के अलावा अपने कोडबेस में कुछ बदलाव करने की ज़रूरत होती है , और (b) आपके द्वारा org.threeten.bp.DateTimeUtilsपुरानी रूपांतरण तिथि-समय कक्षाओं ( Date, GregorianCalendar) में जोड़ी गई नई रूपांतरण विधियों का उपयोग करने के लिए किए गए किसी भी कॉल को बदलना ।

से संक्रमण की प्रक्रिया ThreeTenABP को java.time चिकनी किया जाना चाहिए और लगभग पीड़ारहित।

कब किस फ्रेमवर्क का उपयोग करना है

यहां एक चार्ट तीन रूपरेखाओं को दिखा रहा है, और यह दर्शाता है कि कब किस परिदृश्य में किसका उपयोग करना है।

अद्यतन: एंड्रॉइड ग्रैडल प्लगिन 4.0.0+ एक नया 4 वां विकल्प लाता है, एपीआई जो जावा का एक उपसमुच्चय उपलब्ध कराता है समयबद्ध कार्यक्षमता मूल रूप से पहले के एंड्रॉइड में नहीं बनाई गई थी। केल द्वारा मुख्य उत्तर के शीर्ष को देखें ।

जावा या एंड्रॉइड के किस संस्करण के साथ उपयोग करने के लिए java.time लाइब्रेरी की तालिका


जावा के बारे में

Java.time ढांचे जावा 8 और बाद में बनाया गया है। इन कक्षाओं परेशानी वर्ष प्रतिस्थापित विरासत जैसे तिथि-समय कक्षाएं java.util.Date, Calendar, और SimpleDateFormat

अधिक जानने के लिए, Oracle ट्यूटोरियल देखें । और कई उदाहरणों और स्पष्टीकरणों के लिए ढेर अतिप्रवाह खोजें। विशिष्टता JSR 310 है

Joda समय परियोजना, अब में रखरखाव मोड , प्रवास करने की सलाह देता java.time कक्षाएं।

आप अपने डेटाबेस से सीधे java.time वस्तुओं का आदान-प्रदान कर सकते हैं । JDBC 4.2 या उसके बाद के JDBC ड्राइवर का अनुपालन करें । तारों की कोई जरूरत नहीं, कक्षाओं की कोई जरूरत नहीं । हाइबरनेट 5 और जेपीए 2.2 जावा का समर्थन करते हैंjava.sql.*

Java.time कक्षाएं कहाँ से प्राप्त करें?


4

एंड्रॉइड स्टूडियो में अपनी बिल्ड ग्रेडेल फ़ाइल में निम्नलिखित जोड़ें।

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

एप्लिकेशन वर्ग बनाएं और इसे इस तरह से प्रारंभ करें:

class App : Application() {
    override fun onCreate() {
        super.onCreate()
        AndroidThreeTen.init(this)
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.