2012-05-18 9 views
26

this question पर मेरा उत्तर अभी स्वीकार कर लिया गया था, लेकिन मुझे आश्चर्य हुआ कि बिल्कुल एक को अमान्य करने की आवश्यकता है() एक दृश्य और जब यह आवश्यक नहीं है?जब दृश्य पर अमान्य() निष्पादित करना आवश्यक है?

के बाद सोच का एक सा मैं प्राप्ति के लिए आया था कि यह चाहिए काम और अधिक या कम इस तरह:

  • "सब कुछ" की वास्तविक ड्राइंग होता onResume()
  • "मुक्त" के समय कुछ हिस्सों में
  • के बाद स्क्रीन दोबारा बनाई जा सकती है, लेकिन केवल उन है कि invalidated (और नीचे सब कुछ)

इसलिए थे, यह प्रतीत अगर मैंके बाद कुछ बदल जाएगा(उदा। एक बटन क्लिक के जवाब के रूप में, मुझे invalidate() बदल दिया View)।

हालांकि, this question में स्कैन किस प्रकार से कहता है, यह तब अधिक जटिल होना चाहिए और यह किसी भी विधि का उपयोग करने पर निर्भर करता है।

उदा। पर एक का उपयोग करता है कि क्या

lastClicked.setImageBitmap(); 

या

lastClicked.setImageResource(); 

तो, जब यह() एक दृश्य पर अमान्य निष्पादित करने के लिए और आवश्यक है कि कैसे यह वास्तव में काम करता है?

उत्तर

13

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

इन मामलों में जहां आप चित्र के साथ काम कर रहे हैं में, आप) प्रणाली है कि उसके अंतर्निहित डेटा Widget.invalidate (साथ एक अच्छी स्थिति में नहीं है और फिर से ड्राइंग बताने के लिए है मुख्य थ्रेड पर कतारबद्ध हो जाता है बस जैसा आपने उल्लेख किया था।सिस्टम कार्यान्वयन और एंड्रॉइड संस्करण के आधार पर सिस्टम द्वारा किए गए परिवर्तनों के लिए ट्रैक किया गया है, लेकिन मैं आमतौर पर जो करता हूं वह मानता है कि सिस्टम संसाधन (बाइट एरे, चार सरणी, संसाधन अनुक्रमणिका, संदर्भ पर मैन्युअल ड्राइंग) ट्रैक नहीं किए जाते हैं और की आवश्यकता होती है को अमान्य करें और बाकी सब कुछ सिस्टम द्वारा संभाला जाएगा।

+0

कुछ वाक्यों को सुधारता है लेकिन गलत दृष्टिकोण। !! -1 – ncm

54

(कुछ जवाब स्वीकार करने पर विचार करें)

आम तौर पर, invalidate() साधन देखने के onDraw() विधि का एक कॉल करने के लिए और परिणाम 'स्क्रीन पर पुनः बनाने'। तो अगर कुछ बदलता है और इसे स्क्रीन पर प्रतिबिंबित करने की आवश्यकता है, तो आपको invalidate() पर कॉल करने की आवश्यकता है। हालांकि, अंतर्निहित विजेट्स के लिए शायद ही कभी, यदि कभी भी, इसे स्वयं कॉल करने की आवश्यकता है। जब आप विजेट की स्थिति बदलते हैं, तो आंतरिक कोड invalidate() को आवश्यकतानुसार कॉल करेगा और आपका परिवर्तन स्क्रीन पर दिखाई देगा। उदाहरण के लिए, यदि आप TextView.setText() पर कॉल करते हैं, तो बहुत सारी आंतरिक प्रसंस्करण करने के बाद (पाठ स्क्रीन पर फिट होगा, इसे इलिप्सिज्ड इत्यादि की आवश्यकता होगी), TextViewinvalidate()setText() रिटर्न से पहले कॉल करेगा। इसी प्रकार अन्य विगेट्स के लिए।

यदि आप एक कस्टम व्यू लागू करते हैं, तो आपको invalidate() पर कॉल करना होगा जब भी बैकिंग मॉडल बदलता है और आपको अपना दृश्य फिर से निकालना होगा। इसका उपयोग सरल एनिमेशन बनाने के लिए भी किया जा सकता है, जहां आप राज्य बदलते हैं, फिर invalidate() पर कॉल करें, फिर से राज्य बदलें,

+1

इस उत्तर को पूरा करने के लिए मैं कहूंगा कि एक विजेट पर उपयोग की जा सकने वाली विभिन्न विधियों के कोड को जांचने के लिए कई बार महत्वपूर्ण है, यह समझने के लिए कि अमान्य कॉल कब है और उन्हें कम करने के लिए एक लेआउट लागू करें। उदाहरण के लिए यदि आपके पास एक जटिल लेआउट है तो wrap_content के साथ एक एकल टेक्स्टव्यू हमेशा आपके सभी लेआउट को एक दूसरे के अंत में सेटटेक्स्ट() पर एक कॉल का अंत करेगा, यदि आप एक निश्चित आयाम केवल अंदर के पाठ को प्रबंधित करते हैं दृश्य अधिक तरल पदार्थ जीयूआई के परिणामस्वरूप बदल दिया जाएगा। –

0

कृपया याद रखें कि स्क्रीन पर ड्राइंग अक्सर प्रक्रिया होती है, जब भी आप कोई दृश्य अपडेट करते हैं, तो उस परिवर्तन को सही ढंग से सूचित करने के लिए प्रचार और पुन: खींचा जाना चाहिए। invalidate() एक ट्रिगर विधि है, जो सिग्नल किसी भी दृश्य को फिर से निकालने का बल देता है जिसके लिए आप परिवर्तन दिखाना चाहते हैं।

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