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

Aug 12 2016

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

मैं एंड्रॉइड स्टूडियो 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)

जवाब

200 kael Aug 12 2016 at 23:36

ध्यान दें: तकनीकी रूप से सही होते हुए यह उत्तर अब पुराना हो चुका है

जावा 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 पर आधारित था। हालाँकि, थ्रीटेनाबप रेडमी इंगित करता है, कई कारणों से, जोडा-टाइम सबसे अच्छा विकल्प नहीं है।

इसके बाद थ्रीटेन-बैकपोर्ट है , जो java.timeजावा 7. की जावा 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);
        //...
    }
}
8 BasilBourque May 05 2020 at 07:35

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+ एक नया चौथा विकल्प लाता है, एपीआई जो जावा का एक सबसेट उपलब्ध कराने के लिए उकसाता है। समय की कार्यक्षमता मूल रूप से पहले के एंड्रॉइड में नहीं बनाई गई थी। केल द्वारा मुख्य उत्तर के शीर्ष को देखें ।


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

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 कक्षाएं कहाँ से प्राप्त करें?

5 RichardKamere Aug 19 2019 at 00:02

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

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

एप्लिकेशन क्लास बनाएं और इसे इनिशियलाइज़ करें:

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