2011-09-29 5 views
19

एंड्रॉइड के invalidate() और postInvalidate() विधियों के बीच क्या अंतर है? प्रत्येक को कब बुलाया जाता है? क्या विधियों को केवल कक्षाओं में बुलाया जाना चाहिए जो View का विस्तार करते हैं?एंड्रॉइड की अमान्य() और postInvalidate() विधियों के बीच क्या अंतर है?

उत्तर

33

यदि आप UI Thread से अपना विचार आकर्षित करना चाहते हैं तो आप invalidate() विधि पर कॉल कर सकते हैं।

यदि आप Non UI Thread से अपना विचार आकर्षित करना चाहते हैं तो आप postInvalidate() विधि पर कॉल कर सकते हैं।

व्यू क्लास से प्राप्त प्रत्येक वर्ग को अमान्य और पोस्टइवालिडेट विधि है। अगर अमान्य हो जाता है तो यह सिस्टम को बताता है कि वर्तमान दृश्य बदल गया है और इसे जितनी जल्दी हो सके इसे फिर से खींचा जाना चाहिए। चूंकि इस विधि को केवल आपके यूआईटीएचड से ही बुलाया जा सकता है जब आप यूआईटीएचड में नहीं हैं और फिर भी सिस्टम को सूचित करना चाहते हैं कि आपका व्यू बदल गया है। PostInvalidate विधि सिस्टम को गैर-यूआईटीएचड से सूचित करती है और जल्द से जल्द UIThread पर अगले ईवेंट में दृश्य को फिर से खींचा जाता है। यह भी शीघ्र ही SDK दस्तावेज़ में समझाया गया है:

CLICK HERE

अद्यतन:

वहाँ कुछ समस्या पैदा जब अन्य धागे से postInvalidate का उपयोग कर (जैसे नहीं होने UI को अपडेट राइट दूर), इस कर रहे हैं और अधिक कुशल हो जाएगा:

runOnUiThread(new Runnable() { 
    public void run() { 
    myImageView.setImageBitmap(image); 
    imageView.invalidate(); 
    } 
}); 
+3

कि नहीं होगा कि वास्तव में क्या postInvalidate() करता है? – rupps

+0

एंड्रॉइड के उदाहरण कोड में: http://developer.android.com/training/custom-views/index.html, एक PieChart.java है जिसमें संपत्ति गेटर्स और सेटर्स अंदर हैं। अधिकांश संपत्ति सेटर्स अमान्य(); कहते हैं। PieChart.java एक UI थ्रेड नहीं है और यह वहां से अमान्य कहां कॉल कर सकता है? (एक मुख्य गतिविधि जावा फ़ाइल है जो मुख्य धागा है)। मैं postinvalidate() के लिए एक कॉल की उम्मीद की होगी; जैसे कि उन्होंने PieChart.java में ऑन ड्रा विधि के तहत इसे कैसे किया। – Simon

+0

@ सिमॉन मैंने कोड को नहीं देखा है, लेकिन PieChart.java अभी भी यूआई थ्रेड पर काम करेगा जब तक कि यह थ्रेड फैलाता है या किसी अन्य तरीके से उपयोग करने के लिए किसी अन्य थ्रेड को निर्दिष्ट नहीं करता है। संभवतः क्या हो रहा है कि पाई चार्ट खींचा गया है, फिर यूआई थ्रेड में एक व्यू पर पाई चार्ट खींचने के लिए पाई चार्ट के 'ऑन ड्रा' के भीतर 'postInvalidate() 'कहा जाता है। –

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