Android - एक्टिविटी कंस्ट्रक्टर बनाम ऑनक्रिएट


88

मैं समझता हूं कि एंड्रॉइड के Activitiesपास विशिष्ट जीवनचक्र है और onCreateइसे ओवरराइड किया जाना चाहिए और इसे आरंभीकरण के लिए उपयोग किया जाना चाहिए, लेकिन निर्माणकर्ता में वास्तव में क्या होता है? क्या ऐसे कोई मामले हैं, जब आपको Activityकंस्ट्रक्टर को भी ओवरराइड करना चाहिए / करना चाहिए , या आपको इसे कभी नहीं छूना चाहिए?

मैं मान रहा हूं कि कंस्ट्रक्टर का उपयोग कभी नहीं किया जाना चाहिए क्योंकि संदर्भों को Activitiesपूरी तरह से साफ नहीं किया जाता है (इस प्रकार कचरा कलेक्टर में बाधा) और यह onDestroyउस उद्देश्य के लिए है। क्या ये सही है?


2
इस तथ्य के बारे में क्या है कि एंड्रॉइड किसी भी समय आपकी गतिविधि को नष्ट / फिर से बना सकता है? आपको पता नहीं है कि कंस्ट्रक्टर को तब भी बुलाया जाएगा और यहां तक ​​कि अगर - किस कंस्ट्रक्टर को बुलाया जाएगा ... (यही बात फ्रेग्मेंट्स पर भी लागू होती है और यही वजह है कि हर फ्रैगमेंट को एक खाली डिफॉल्ट कंस्ट्रक्टर को लागू करना पड़ता है)।
मैरियन पाडज़िओच

जवाबों:


34

मैं कंस्ट्रक्टर में कुछ भी करने का कोई अच्छा कारण नहीं सोच सकता। आप कभी भी सीधे गतिविधि का निर्माण नहीं करते हैं, इसलिए आप इसे मापदंडों में पारित करने के लिए उपयोग नहीं कर सकते हैं। आम तौर पर, बस onCreate में चीजें करें।


73
onCreate () आपको अंतिम फ़ील्ड का उपयोग करने से रोकता है।
गिली

2
लेकिन OnCreate को केवल एक बार नहीं कहा जाता है, क्या मैं गलत हूं? जब मैं स्क्रीन ओरिएंटेशन और बैक को अपने हाथ से बदलता हूं, तो हर बार गतिविधि फिर से शुरू हो जाती है, ऑन्क्रिएट को कहा जाता है
फ़र्किस

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

OnCreate ईवेंट कब ठीक से चलना शुरू होता है? जब मैं ऑनक्रिएट इवेंट की शुरुआत में एक ब्रेकपॉइंट सेट करता हूं तो ऐप रन होता है और स्क्रीन पर गतिविधि को लोड करता है तो ब्रेकपॉइंट सक्रिय हो जाता है और ऐप पॉज़ हो जाता है। मुझे गतिविधि के बारे में एक घटना की आवश्यकता है जो गतिविधि को शुरू करने और लॉन्च करने से पहले ठीक से सक्रिय करती है।
मोहम्मद अफ्रशतेह

@ शेरिल साइमन, आपने बताया कि आप कभी भी सीधे गतिविधि नहीं बनाते हैं, फिर गतिविधि कौन बनाता है?
श्रीकांत करुमनघाट

7

कंस्ट्रक्टर में चीजों को डालने का एक अच्छा कारण, जैसा कि गिल्ली की टिप्पणी ने कहा था कि अंतिम क्षेत्रों का उपयोग है।

हालाँकि, यदि आप कंस्ट्रक्टर में चीजों को इनिशियलाइज़ करते हैं, तो ऑब्जेक्ट का जीवनकाल थोड़ा लंबा होगा, हालाँकि मैं इसके बारे में ज्यादा नहीं सोचता क्योंकि onCreateइसके तुरंत बाद कहा जाएगा।

हालांकि यह मेरे आदर्श के खिलाफ है, मैं निर्माण सदस्यों को गतिविधि के सदस्यों के आरंभ के लिए टालता हूं onResume()और onPause()उन संसाधनों पर भरोसा करता हूं जो मेरे ऐप के साथ काम कर रहे हैं।

क्योंकि onCreate()मैं आमतौर पर इसका उपयोग स्थानीय चर को मैपिंग देखने के लिए करता हूं। हालाँकि android-annotations पहले से ही मेरे लिए है, इसलिए मेरे पास onCreate()अपनी गतिविधि के लिए शायद ही कोई तरीका है। मैं इसे अभी भी सेवा में उपयोग करता हूं।

हालाँकि, यदि आप सदस्यों को देखते हैं तो आप प्रारंभिक हो सकते हैं

  • उनके पास एक "करीब" विधि होगी जिसे आपको उचित समय पर चालू करना होगा (onResume या onPause)

  • वे उस दृश्य का हिस्सा होंगे जिसका अर्थ है कि इसे आरंभीकृत करने की आवश्यकता है फिर ऑनक्रीट को बुलाया जाना चाहिए

  • वे स्थिरांक हैं जिन्हें वैसे भी कंस्ट्रक्टर में डालने की आवश्यकता नहीं है, बस एक स्थिर फाइनल करेगा। इसमें पेंट और पथ स्थिरांक शामिल हैं जिन्हें एक स्थिर ब्लॉक द्वारा आरंभीकृत किया जा सकता है


1
आपका क्या मतलब है कि वस्तु का जीवनकाल थोड़ा लंबा होगा? मैं क्या रास्ता? उदाहरण के लिए, अगर आपने इन अंतर्ग्रहणों को onCreate में स्थानांतरित कर दिया, उदाहरण के लिए, अभी भी वही समय है। जीवन काल में कोई अंतर नहीं है जिसे मैं निर्धारित कर सकता हूं। क्या आप इस पर थोड़ा और विस्तार कर सकते हैं, जैसा कि मैं महसूस करता हूं, एक रिश्तेदार नवागंतुक के रूप में, मैं यहां कुछ महत्वपूर्ण याद कर रहा हूं।
रिचीएचएच

2
@ RichieHH अब तक आर्किमिडीज सिर्फ इतना कह रहे हैं कि कंस्ट्रक्टर को ऑनक्रिएट () से पहले बुलाया जाता है और इसलिए जो कुछ भी किया गया है वह तब तक कायम रहेगा जब तक कि गतिविधि नष्ट न हो जाए
(

6

मैं अब एक ऐसे मामले पर हूं जो कंस्ट्रक्टर को ओवरराइड करने की आवश्यकता है। वास्तव में, मेरे पास कुछ गतिविधियाँ हैं जिनकी संरचना समान है। इसलिए कई गतिविधियाँ बनाने के बजाय, मैं एक "मास्टर" गतिविधि बनाऊँगा और दूसरे लोग इसे विरासत में प्राप्त करेंगे। इसलिए मुझे बच्चे की गतिविधि के निर्माता को ओवरराइड करने के तरीकों में उपयोग किए जाने वाले कुछ चर को शुरू करने में सक्षम होने की आवश्यकता है।

दो शब्दों में, निर्माता आपको एक "मास्टरएक्टिविटी" का अनुकरण करता है जिसे विरासत द्वारा पुन: उपयोग किया जा सकता है!


15
मुझे पता है कि यह पुराना है, लेकिन ऑनक्रिएट () में सुपर फील्ड इंस्टेंटेशन को लागू करने पर यहाँ क्या लाभ है। आप वैसे भी बच्चे से super.onCreate () बुला रहे होंगे।
एंड्रयू जी

तो बस गतिविधि शुरू करते समय बंडल या इरादे में एक ही कुंजी में अंतर मानों को पारित करके और उसी गतिविधि का उपयोग करके आप यह निर्धारित कर सकते हैं कि प्राप्त मूल्य के आधार पर गतिविधि में क्या दिखाना है। आप कॉन्ट्रा्यूटर्स के लिए क्या विशिष्ट कारण हैं? या फिर गतिविधि के गैर-बदलते हिस्से को सामान्य रखते हुए और बाकी के बदलते हिस्से के लिए आप फ़्रैगमेंट बना सकते हैं।
नयनेश गुप्ते

0

आपको कंस्ट्रक्टर को ओवरराइड करने की आवश्यकता है जब आपकी गतिविधि में कस्टम परम होंगे या आप उन कक्षाओं से कॉल ट्रैक करना चाहते हैं जो विरासत में मिली थीं।


1
क्या आप इस बारे में विस्तार से बता सकते हैं? आप जो वर्णन करते हैं वह दिलचस्प लगता है, लेकिन यह थोड़ा अस्पष्ट है। धन्यवाद!
देवता मानना

3
मान लीजिए आपको एक कस्टम एक्टिविटी क्लास बनाने की ज़रूरत है जो 2 या उससे अधिक परम लेती है। आपको बस कंस्ट्रक्टर का उपयोग करने की आवश्यकता है, आप इसे ऑनक्रिएट और एक्स्ट्रा के माध्यम से नहीं कर सकते। क्या इसने सहायता की?
पेंटियम

1
यह हो सकता है कि मुझे एक निजी की आवश्यकता है। मान लीजिए कि मैं एक अनुकूलित संपर्क पिकर उदाहरण के लिए एक कस्टम घटक बनाना चाहता हूं। आदेश में startActivityForResultमुझे अपने कस्टम घटक में एक निजी कंस्ट्रक्टर को शामिल करना होगा, भले ही उस गतिविधि को कभी भी लॉन्च नहीं किया जाएगा और इसमें कोई दृश्य तत्व नहीं हैं, मैं बस इसके परिणाम सामग्री के लिए उपयोग करता हूं।
पेंटियम

6
मैं कहने जा रहा हूँ, कि मुझे @Pentium से कोई मतलब नहीं है, कोड उदाहरण के बिना नहीं।
ब्लंडेल

मुझे लगता है कि कंस्ट्रक्टर के माध्यम से काम करने का एक फायदा "टेम्पलेट" गतिविधि है जो उन मापदंडों में ले सकता है जो विरासत में मिला वर्ग लाभ उठा सकता है। उदाहरण के लिए यदि आपके पास दो गतिविधियाँ हैं जो केवल कुछ गुणों में भिन्न हैं जैसे कि R.id.cameraSurface, R.id.videoSurface तो आप एक ऐसा कंस्ट्रक्टर बना सकते हैं जो पैरामीटर में ले जाएगा इसे AbstractResourceActivity कहते हैं और फिर आपके पास CameraActivity है जो पंजीकृत है प्रकट होने पर जो संसाधन ID में गुजर रही AbstractResourceActivity को बढ़ाता है।
आर्किमिडीज ट्रेजानो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.