2010-11-17 6 views
102

मैं एक काफी जटिल एंड्रॉइड एप्लिकेशन पर काम कर रहा हूं जिसके लिए आवेदन के बारे में कुछ बड़ी मात्रा में डेटा की आवश्यकता है (मैं कुल 500 केबी कहूंगा - यह मोबाइल के लिए बड़ा है डिवाइस?)। जो मैं बता सकता हूं, आवेदन में कोई अभिविन्यास परिवर्तन (गतिविधि में, अधिक सटीक होने के लिए) गतिविधि का पूर्ण विनाश और मनोरंजन का कारण बनता है। मेरे निष्कर्षों के आधार पर, एप्लिकेशन क्लास में एक ही जीवन चक्र नहीं होता है (यानी यह सभी उद्देश्यों और उद्देश्यों के लिए, हमेशा तत्काल होता है)। क्या यह सूचना वर्ग के अंदर राज्य की जानकारी को स्टोर करने और फिर गतिविधि से संदर्भित करने के लिए समझ में आता है, या आमतौर पर मोबाइल उपकरणों पर स्मृति बाधाओं के कारण "स्वीकार्य" विधि नहीं है? मैं वास्तव में इस विषय पर किसी भी सलाह की सराहना करता हूं। धन्यवाद!डेटा को जारी रखने के लिए एंड्रॉइड एप्लिकेशन क्लास का उपयोग

+8

बस ध्यान रखें कि यदि आपका ऐप पृष्ठभूमि में जाता है तो आपके एप्लिकेशन में डेटा अभी भी हटाया जा सकता है, इसलिए यह उस डेटा को बनाए रखने का समाधान नहीं है जिसे आप हमेशा वापस पाने में सक्षम होना चाहते हैं। यह अक्सर महंगी वस्तुओं को फिर से बनाने की विधि के रूप में कार्य करता है। –

+2

माया; मुझे नहीं लगता कि ऐप "आमतौर पर" हटा दिया गया है (हालांकि, जैसा कि कोई इस थ्रेड में बाद में इंगित करता है, यह "हो सकता है")। मैं शायद डेटा को स्टोर और लोड करने के लिए एप्लिकेशन का उपयोग करने के कुछ प्रकार के "हाइब्रिड" दृष्टिकोण के साथ जा रहा हूं, लेकिन फिर सामान्य व्यवहार को ओवरराइड करने के लिए मैनिफेस्ट फ़ाइल में गतिविधि पर "एंड्रॉइड: ओरिएंटेशन" विशेषता का उपयोग करें गतिविधि को फाड़ना और पुनर्निर्माण करना। यह सब, ज़ाहिर है, मानता है कि एप्लिकेशन "कब" नष्ट हो रहा है, यह निर्धारित कर सकता है कि डेटा जारी रखा जा सके। – Dave

उत्तर

129

मुझे नहीं लगता कि 500kb एक सौदा का बड़ा होगा।

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

यदि आप इसका उपयोग करने जा रहे हैं तो आप ग्लोबल सिंगलटन में डेटा पास कर सकते हैं।

public class YourApplication extends Application 
{  
    public SomeDataClass data = new SomeDataClass(); 
} 

फिर से किसी भी गतिविधि में इसे कहते:

YourApplication appState = ((YourApplication)this.getApplication()); 
appState.data.UseAGetterOrSetterHere(); // Do whatever you need to with the data here. 

मैं इसे here in my blog post पर चर्चा, धारा के तहत "ग्लोबल सिंगलटन।"

+1

दुर्भाग्य से प्रश्न में ब्लॉग पोस्ट अब उस पते पर उपलब्ध नहीं है। – mikebabcock

+1

मैं अपनी साइट पर चीजों को चारों ओर ले जा रहा हूं। जब तक यह तय नहीं हो जाता है, तो आप इसे archive.org पर यहां देख सकते हैं: https://web.archive.org/web/20130818035631/http://www.bryandenny.com/index.php/2010/05/25/what- i-learn-from-writing-my-first-android-application –

+1

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन मुझे अभी एक समस्या आई है जो यह हल हो सकती है, हालांकि इस वर्ग को किसी भी तरह प्रकट में घोषित करने की आवश्यकता है, नहीं? मैं वर्ग को एसीएसएस नहीं कर सकता, इसलिए मुझे ऐसा लगता है कि मैं क्या खो रहा हूं ... –

1

आप वास्तव में यह सुनिश्चित करने के लिए अभिविन्यास कार्यक्षमता को ओवरराइड कर सकते हैं कि आपकी गतिविधि नष्ट नहीं हुई है और फिर से बनाई गई है। here देखें।

+15

आप बहुत सी चीजें कर सकते हैं। इसका मतलब यह नहीं है कि वे अच्छे विचार हैं। यह एक अच्छा विचार नहीं है। – Andrew

+0

स्क्रीन अभिविन्यास को बदलकर परीक्षण करना यह सुनिश्चित करने का सबसे आसान तरीका है कि आपका ऐप ऐसा करता है जो एंड्रॉइड ऐसा करता है। – 18446744073709551615

55

जो Application उदाहरण पर गिनते हैं वे गलत हैं। सबसे पहले, ऐसा लगता है कि Application तब तक मौजूद है जब तक कि संपूर्ण ऐप प्रक्रिया मौजूद न हो लेकिन यह एक गलत धारणा है।

ओएस आवश्यकतानुसार प्रक्रियाओं को मार सकता है। सभी प्रक्रियाओं को "मारने योग्यता" के 5 स्तरों में विभाजित किया गया है specified in the doc

तो, उदाहरण के लिए, यदि आपका ऐप आने वाली कॉल का जवाब देने वाले उपयोगकर्ता के कारण पृष्ठभूमि में जाता है, तो रैम की स्थिति के आधार पर, ओएस आपकी प्रक्रिया को मार सकता है (या नहीं) (Application को नष्ट कर सकता है) प्रक्रिया में उदाहरण)।

मुझे लगता है कि persist your data to internal storage file पर एक बेहतर दृष्टिकोण होगा और फिर आपकी गतिविधि फिर से शुरू होने पर इसे पढ़ें।

अद्यतन:

मैं कई नकारात्मक फीडबैक मिला है, इसलिए यह एक स्पष्टीकरण जोड़ने के लिए समय है। :) ठीक है, शुरुआत में मैंने वास्तव में एक गलत धारणा का उपयोग किया कि राज्य ऐप के लिए वास्तव में महत्वपूर्ण है। हालांकि यदि आपका ऐप ठीक है कि कभी-कभी राज्य खो जाता है (यह कुछ छवियां हो सकती हैं जो केवल रीड/रीडाउनलोड हो जाएंगी), तो इसे Application के सदस्य के रूप में रखना ठीक है।

+13

यदि आवेदन मारे गए हैं, तो कौन परवाह करता है, है ना? आवेदन चला गया है। जैसा कि मैं इसे समझता हूं, एंड्रॉइड उन प्रक्रियाओं को पुनः प्राप्त करेगा जिनमें क्रियाकलाप जैसी स्मृति शामिल है। यदि आवेदन वाली प्रक्रिया में मारे गए हैं (यदि एंड्रॉइड भी ऐसा करेगा?), यह अनिवार्य रूप से ऐप को मारने जैसा है। उपयोगकर्ता को ऐप लॉन्च करने की आवश्यकता होगी और उस बिंदु पर, कौन परवाह करता है? यह एप्लिकेशन का एक नया उदाहरण है। – Andrew

+13

यह उत्पादन में हमारे लिए एक अनोखा आश्चर्य था। मेरा मानना ​​है कि एंड्रॉइड प्रक्रियाओं को मारता है, यह सिर्फ रैम स्थिति और दस्तावेज में वर्णित अन्य कारकों पर निर्भर करता है। यह हमारे लिए एक दुःस्वप्न था इसलिए मैं अपना असली अनुभव साझा करता हूं।खैर हमारे पास अनुकरणकर्ताओं पर यह नहीं था, लेकिन असली दुनिया में कुछ डिवाइस ऐप्स के साथ 'अधिभारित' होते हैं, इसलिए पृष्ठभूमि प्रक्रिया को मारना एक सामान्य स्थिति है। हां, यदि उपयोगकर्ता ऐप को अग्रभूमि में लाने का निर्णय लेता है - ओएस 'एप्लिकेशन' इंस्टेंस समेत अपने स्टैक को पुनर्स्थापित करता है, हालांकि आपका स्थिर डेटा तब तक नहीं होगा जब तक आप इसे जारी नहीं रखते। –

+2

मुझे लगता है कि मैं शायद एक संकर दृष्टिकोण का उपयोग करने जा रहा हूं। मैं पहले से ही अभिविन्यास परिवर्तन को ओवरराइड करने के लिए मैनिफेस्ट चाल के बारे में जानता था (जिसमें अन्य लाभ हैं)। चूंकि एप्लिकेशन एक गेम है, इसलिए मुझे यकीन नहीं है कि लॉन्च के बीच डेटा लगातार "महत्वपूर्ण" है; यद्यपि यह शायद बहुत कठिन नहीं होगा क्योंकि अधिकांश डेटा को क्रमबद्ध किया जा सकता है (हालांकि मैं प्रत्येक अभिविन्यास परिवर्तन के बीच क्रमबद्ध और अनुक्रमित नहीं करना चाहता)। मैं निश्चित रूप से इनपुट की सराहना करता हूं। मैं उन लोगों को नहीं कहूंगा जो ऐप इंस्टेंस पर निर्भर हैं "गलत" हैं। ऐप पर बहुत निर्भर करता है :)। – Dave

6

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

उदाहरण के लिए:

public class ApplicationController extends Application { 
    private static ApplicationController _appCtrl; 

    public static ApplicationController getAppCtrl() 
    { 
     return _appCtrl; 
    } 
} 

क्योंकि Application की उपवर्गों भी संसाधन प्राप्त कर सकते हैं, तो आप उन्हें बस यहां पहुंच सकता है जब आप एक स्थिर विधि है, जो उन्हें देता है, की तरह परिभाषित करते हैं:

public static Resources getAppResources() 
{ 
    return _appCtrl.getResources(); 
} 

लेकिन avoid memory leaks पर संदर्भ संदर्भों के आसपास गुजरते समय बहुत सावधान रहें।

+6

आप यह नोट करना भूल गए हैं कि आपको एंड्रॉइड जोड़ना होगा: name = "applicationController" xml कक्षा के लिए तत्काल होने के लिए आपके मैनिफेस्ट में एप्लिकेशन टैग को विशेषता देता है। – eggie5

+0

आपको ऐसा करने के लिए वास्तव में 'एप्लिकेशन' का विस्तार करने की आवश्यकता नहीं है। ऐसा करने के लिए आप किसी भी वर्ग ** ** में स्थिर सदस्य चर घोषित कर सकते हैं। –

2

डेव, यह किस प्रकार का डेटा है? यदि यह सामान्य डेटा है जो पूरे एप्लिकेशन से संबंधित है (उदाहरण: उपयोगकर्ता डेटा), तो एप्लिकेशन क्लास का विस्तार करें और उसे वहां स्टोर करें। यदि डेटा गतिविधि से संबंधित है, तो आपको स्क्रीन रोटेशन पर डेटा को बनाए रखने के लिए ऑनसेवस्टेंसस्टेट और ऑनस्टोर इंस्टेंसस्टेट हैंडलर का उपयोग करना चाहिए।

0

आप एप्लिकेशन क्लास बना सकते हैं और अपने आवेदन में कहीं भी उस कैल्स पर अपने सभी डेटा को सहेज सकते हैं।

संबंधित मुद्दे