एक प्रारंभिक एंड्रॉइड प्रोग्रामिंग पुस्तक के माध्यम से जाने के बाद, मैं कुछ विषयों की मेरी समझ को मजबूत करने के लिए उदाहरण एप्लिकेशन को बदलना चाहता था जो वास्तव में कवर नहीं थे। परिवर्तन करने में, मैंने एक त्रुटि की, लेकिन मुझे उत्सुकता है कि कुछ मामलों में त्रुटि क्यों काम करती है लेकिन दूसरों में नहीं।ऑनवेस्टेंसस्टेट() में गैर-पार्सेलबल ऑब्जेक्ट्स के हैशटेबल को सहेजना क्यों कभी-कभी काम करता है?
एप्लिकेशन के भीतर एक गतिविधि Hashtable<Integer, Question>
में प्रश्नों की एक श्रृंखला संग्रहीत करती है, जहां प्रश्न एक छोटा वर्ग है जिसमें दो और दो स्ट्रिंग हैं। मूल रूप से लिखा गया है, गतिविधि प्रत्येक onCreate()
पर किसी सर्वर से प्रश्न डाउनलोड करती है, इसलिए मैं कुछ अनावश्यक डाउनलोड को रोकने के लिए onSaveInstanceState()
लागू करना चाहता था। onSaveInstanceState()
putSerializable()
का उपयोग कर बंडल में हैशटेबल बचाता है।
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// mQuestions is a member variable of
// type Hashtable<Integer, Question>
if (mQuestions != null && mQuestions.size() > 0) {
outState.putSerializable(SAVED_QUESTIONS, mQuestions);
}
}
यह पता था कि एक पार्सलबल क्या था या कैसे कार्यान्वित किया जाए, इससे पहले भी यह स्क्रीन अभिविन्यास परिवर्तनों के लिए पूरी तरह से काम करता था। मुझे केवल इतना पता था कि जब मैं एमुलेटर की होम कुंजी दबाता था और ऐप चुपचाप दबाता था, तो लॉग इन आउटपुट के साथ अदृश्य रूप से दुर्घटनाग्रस्त हो गया। स्टैक ट्रेस ने मुझे पार्सेलबल को देखने और प्रश्न को लागू करने के लिए प्रेरित किया।
मेरा प्रश्न यह नहीं है कि मैंने क्या किया है। सवाल यह है: जब प्रश्न वर्ग ने पार्सलबल को लागू नहीं किया था, तो ऐप केवल होम दबाए जाने पर और स्क्रीन अभिविन्यास परिवर्तन पर क्यों क्रैश हुआ?
"onSaveInstanceState() बंडल में Hashtable putSerializable() का उपयोग बचाता है।" - उदाहरण के लिए अपने डेटा मॉडल मत डालें। अपने डेटा मॉडल को फ़ाइल या डेटाबेस में रखें। इस तरह आप "अनावश्यक डाउनलोड को रोकें"। "केवल इतना पता था कि जब मैं एमुलेटर की होम कुंजी दबाता था और ऐप चुपचाप दबाता था, तो कोई लॉगकैट आउटपुट के साथ अदृश्य रूप से दुर्घटनाग्रस्त हो गया।" - और इस चुप, अदृश्य दुर्घटना का आपका सबूत है ... क्या, बिल्कुल? – CommonsWare
@ कॉमन्सवेयर: एपलीप्स में एक पॉपअप विंडो डिबग परिप्रेक्ष्य खोलने के लिए कह रही है क्योंकि लॉन्च निलंबित कर दिया गया था। इस तरह मैं जानता था कि यह दुर्घटनाग्रस्त हो गया। मैंने प्रश्न पार्ससेलबल बनाने के लिए कोड पर टिप्पणी की है, और एक कोशिश (कई में से) पर, यह लॉग इन त्रुटियों के साथ मजबूर हो गया है, लेकिन यह सवाल पोस्ट करने से पहले ऐसा नहीं हुआ था। – erichamion
हां, डेटा वास्तव में एक फ़ाइल में सहेजा जाना चाहिए, लेकिन यह वह नहीं है जिसे मैं करने की कोशिश कर रहा था। मैं एक उत्पादन ऐप पर काम नहीं कर रहा हूं (यहां तक कि व्यक्तिगत, शौक के उपयोग के लिए)। मैं 24 घंटे की पुस्तक में _Sam के अपने आप को एंड्रॉइड एप्लिकेशन डेवलपमेंट के माध्यम से बनाए गए डेमो ऐप को संशोधित कर रहा था। यहां तक कि एक प्रारंभिक पुस्तक के लिए, यह कुछ बहुत ही बुनियादी विषयों को छोड़ना प्रतीत होता है। मैं देखना चाहता था कि कैसे SaveInstanceState() काम करता है। मुझे लगता है कि मेरे पास अब इसके मैकेनिक्स हैं, अगर नहीं और कब इसका सबसे अच्छा उपयोग किया जाए। – erichamion