ध्यान दें: जावा 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);
//...
}
}