Android स्थिर वस्तु जीवनचक्र


101

मैं ईवेंट खोज एप्लिकेशन बना रहा हूं, हम एक स्क्रीन से दूसरे स्क्रीन में पॉप्युलेट मानदंड सेट करते हैं, फिर उपयोगकर्ता तृतीय स्क्रीन से खोज मानदंड संपादित कर सकते हैं और 4 डी स्क्रीन पर जाते हैं।

उपरोक्त कार्य को प्राप्त करने के लिए मैं स्थिर ऑब्जेक्ट का उपयोग कर रहा हूं जो एप्लिकेशन के आस-पास के मूल्यों को याद रखता है और मुझे किसी भी चीज को अतिरिक्त करने की आवश्यकता नहीं है।

लेकिन मुझे डर है कि अगर एंड्रॉइड में स्थिर ऑब्जेक्ट जीवन चक्र के बारे में अगर कम मेमोरी मिली तो एंड्रॉइड स्थिर वस्तुओं को हटा दें ???

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

जवाबों:


238

थोड़ा पृष्ठभूमि के साथ शुरू करें: जब आप कोई एप्लिकेशन शुरू करते हैं तो क्या होता है?
OS एक प्रक्रिया शुरू करता है और इसे एक अद्वितीय प्रक्रिया आईडी देता है और एक प्रक्रिया तालिका आवंटित करता है। प्रक्रिया DVM (Dalvik VM) का एक उदाहरण शुरू करती है; प्रत्येक अनुप्रयोग एक DVM के अंदर चलता है।
एक DVM वर्ग लोडिंग अनलोडिंग, उदाहरण जीवन चक्र, जीसी आदि का प्रबंधन करता है।

स्टैटिक वैरिएबल का लाइफटाइम: एक स्टैटिक वैरिएबल तब अस्तित्व में आता है जब एक क्लास को JVM द्वारा लोड किया जाता है और क्लास के अनलोड होने पर उसकी मौत हो जाती है।

इसलिए यदि आप एक एंड्रॉइड एप्लिकेशन बनाते हैं और एक स्थिर वैरिएबल को इनिशियलाइज़ करते हैं, तो यह JVM में बना रहेगा, जब तक कि निम्न में से कोई एक नहीं हो जाता:
1. क्लास अनलोड
किया जाता है
। JVM बन्द हो जाता है 3. प्रक्रिया मर जाती है

ध्यान दें कि जब आप किसी अन्य एप्लिकेशन की किसी भिन्न गतिविधि पर स्विच करते हैं तो स्टैटिक वैरिएबल का मान बना रहेगा और उपरोक्त तीनों में से कोई भी नहीं होता है। उपरोक्त तीनों में से किसी एक के होने पर स्थैतिक को अपना मूल्य खोना चाहिए।

आप कोड की कुछ पंक्तियों के साथ इसका परीक्षण कर सकते हैं:

  1. अपनी गतिविधि के onCreate में असिंचित स्थैतिक को प्रिंट करें -> अशक्त प्रिंट करना चाहिए
  2. स्टेटिक को इनिशियलाइज़ करें। इसे प्रिंट करें -> मान गैर अशक्त होगा
  3. बैक बटन को हिट करें और होम स्क्रीन पर जाएं। नोट: होम स्क्रीन एक और गतिविधि है।
  4. अपनी गतिविधि को फिर से शुरू करें -> स्टेटिक वैरिएबल नॉन-नल होगा
  5. DDMS से अपनी एप्लिकेशन प्रक्रिया को मारें (डिवाइस विंडो में स्टॉप बटन)।
  6. अपनी गतिविधि को पुनरारंभ करें -> स्थैतिक का अशक्त मूल्य होगा।

उम्मीद है की वो मदद करदे।


1
मैं जानना चाहता हूं कि मैं एप्लिकेशन ऑब्जेक्ट में अपना फ़ील्ड मान क्यों खो देता हूं अगर यह स्थिर नहीं होता है जब मैं उदाहरण के लिए नई गतिविधि शुरू करता हूं तो मैं एप्लिकेशन ऑब्जेक्ट में चर वर्तमान पृष्ठ घोषित करता हूं और नई गतिविधि खोलने पर इसका मूल्य हमेशा शून्य पर लौटता है
मोहम्मद सुभी शेख कुरैशी

जब मैं super.onRestoreInstanceState (saveInstanceState) कहता हूं; मैं अपना चर खो देता हूं भले ही वे स्थिर हों, समस्या क्या है?
मोहम्मद सुबी शेख कुरुश

1
यह एक अच्छी व्याख्या है (इसलिए -1 नहीं) लेकिन यह थोड़ा असंगत है: ओपी ने स्पष्ट रूप से "कम स्मृति स्थितियों" (उसी कारण से मैं यहां हूं) के बारे में पूछा, जहां तक ​​मुझे पता है कि ओएस वीएम को मार सकता है। बाद में इसे उसी मापदंडों के साथ फिर से शुरू करें, और यह मामला ( यदि यह एक वास्तविक बात है) यहां कवर नहीं किया गया है ...
रिक

1
@suitianshi मुझे लगता है कि हम Application.onCreate में स्टेटिक इंस्टेंस को इनिशियलाइज़ कर सकते हैं, क्योंकि भले ही हमारा ऐप बैकग्राउंड में चला जाए और प्रोसेस मारी जाए, जैसे ही हम अपने ऐप में वापस जाएंगे, ऐप्लीकेशन तुरंत हो जाएगा और इसे अपने जीवनचक्र के तरीकों को कॉल करें। फिर! हालांकि मुझे इस पर पुष्टि की आवश्यकता है, मुझे आश्चर्य है कि क्या कोई परिदृश्य हो सकता है जहां स्थिर उदाहरण Application.onCreate में आरंभिक रूप से अपना मूल्य खो देता है?
सार्थक मित्तल

1
मुझे यहाँ जो कुछ याद आ रहा है वह "1. क्लास अनलोडेड" के लिए एक स्पष्टीकरण है - यह कब होगा? अगर मेमोरी पर कम चल रहा है तो क्या JVM एक क्लास को लोड करेगा?
ज्येष्ठ

16

खैर, सिंगलटन पैटर्न भी स्थैतिक चर का उपयोग करने पर आधारित है, इसलिए वास्तव में आप उसी स्थिति में होंगे। हालांकि स्थैतिक दृष्टिकोण अधिकांश समय काम कर सकता है, ऐसा हो सकता है कि कुछ मामलों में जब मेमोरी पूरी हो और दूसरी गतिविधि आपके अगली स्क्रीन पर जाने से पहले अग्रभूमि ले जाए, तो आपकी गतिविधि की प्रक्रिया की मृत्यु हो सकती है और आप स्थैतिक मूल्यों को खो देते हैं। हालाँकि Android राज्यों के बीच मूल्यों को बनाए रखने या उन्हें प्रसारित करने के कुछ विकल्प प्रदान करता है:

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

आप Google कोड या अन्य खुले स्रोत एंड्रॉइड एप्लिकेशन में एजिस-शील्ड सोर्स कोड ट्री को देखकर वरीयताओं, इरादों और साइक्लाइट डेटाबेस के उपयोग के कुछ कोड उदाहरण प्राप्त कर सकते हैं ।


6

कुछ शोधों के बाद, यह पता चला कि एकल को स्टोर करने के लिए एप्लिकेशन का उपयोग करना एक विचार का महान नहीं है, जब तक कि आप इसे फिर से तैयार करने के लिए तैयार न हों:

एप्लिकेशन ऑब्जेक्ट में डेटा संग्रहीत न करें

इसलिए जबकि स्वीकृत उत्तर तकनीकी रूप से सही है, यह सभी जानकारी प्रदान नहीं करता है।

जैसा कि ऊपर दिए गए लिंक से पता चलता है, यदि आप वास्तव में उस मॉडल से चिपके रहना चाहते हैं, तो आपको संभव हो तो, अशक्त की जाँच करने और डेटा को पुनः बनाने के लिए तैयार रहने की आवश्यकता है।


3

@ r1k0 यहीं है। किसी वर्ग के स्थैतिक क्षेत्रों में डेटा संचय अपने आप ही आवेदन प्रक्रिया को मारता है और पुनरारंभ करता है। एंड्रॉइड नियमित रूप से मेमोरी की आवश्यकता होने पर (चल रहे ऐप) प्रक्रियाओं को मारता है।

प्रति Android डॉक्टर: गतिविधि की स्थिति और मेमोरी से इजेक्शन ,

सिस्टम कभी भी किसी गतिविधि को सीधे नहीं मारता है। इसके बजाय, यह उस प्रक्रिया को मारता है जिसमें गतिविधि चलती है, न केवल गतिविधि को नष्ट कर देती है, बल्कि प्रक्रिया में चलने वाली बाकी सभी चीजें, साथ ही साथ।

आप नीचे दिए गए तरीकों का उपयोग करके प्राइमिटिव्स की स्थिति के साथ-साथ Serializable और Parcelable ऑब्जेक्ट्स को सहेज और पुनर्स्थापित कर सकते हैं। इन्हें सामान्य गतिविधि जीवनचक्र के दौरान स्वचालित रूप से कहा जाता है।

protected void onSaveInstanceState(Bundle state) {}
protected void onRestoreInstanceState(Bundle savedInstanceState){}

इसलिए, यदि आपके पास एक वर्ग है जिसमें केवल स्थिर चर हैं, तो आप onSaveInstanceState () में प्रत्येक फ़ील्ड की स्थिति को सहेज सकते हैं और उन्हें onRestoreInstanceState () में पुनर्स्थापित कर सकते हैं। जब एंड्रॉइड उस प्रक्रिया को मारता है जो आपके ऐप में चल रही है, तो आपके वेरिएबल्स की स्थिति बच जाएगी, और जब एंड्रॉइड आपके ऐप को पुनर्स्थापित करता है, तो पहले की तरह ही मेमोरी में मान बहाल हो जाएंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.