2010-09-27 10 views
5

मेरे पास प्रत्येक पंक्ति पर 3 टेक्स्टव्यू फ़ील्ड के साथ एक साधारण सूची है। हम एक पृष्ठभूमि वेब सेवा कॉल (AsyncTask) से आने वाले डेटा के साथ तो उनके मूल्यों हर 2 सेकंड या अपडेट कर रहे हैंलिस्टव्यू के ऐरेएडाप्टर notifydatasetchanged() बहुत धीमी रेड्रा

हम वर्तमान लोगों के साथ आ रहा है मानों की तुलना, उन्हें एडाप्टर पर तदनुसार अद्यतन और अंत में notifyDataSetChanged() यदि

जरूरत बुला

बात यह है कि रेड्रा वास्तव में धीमा हो जाता है इस प्रकार पूरे यूआई को लटकता है जब हमें एक बार में 3 से अधिक अपडेट पंक्तियां मिलती हैं। बेशक हम सभी ListView प्रसिद्ध ऑप्टिमाइज़ेशन जैसे कुशल एडेप्टर दृष्टिकोण (setTag() और धारकों) का उपयोग कर रहे हैं, और getViewTypecount()/getItemViewType() प्राप्त करें। हमने लेआउटटॉप के साथ जितना संभव हो सके हमारे इंटरफ़ेस को अनुकूलित करने और चीजों को हल्का करने के लिए wrap_content चौड़ाई और ऊंचाइयों से बचने का प्रयास करने का प्रयास किया है।

हम अपने अपडेट पर महंगे संचालन नहीं करते हैं, केवल मानक सामान: टेक्स्ट व्यू टेक्स्ट, टेक्स्टकलर और पृष्ठभूमि रंग मूल्य बदलना।

केवल अजीब बात मैं देख सकता हूँ कि getView() प्रत्येक पंक्ति के लिए 3-4-5 बार कहा जाता है, हालांकि मैं उन सभी के रोमेन के संदेश पढ़ चुके है [1] से कहा कि कि

साथ कुछ भी गलत नहीं है

कोई विचार या संकेत हम इसे कैसे गति दे सकते हैं?

बहुत बहुत धन्यवाद!

[1] http://groups.google.com/group/android-developers/browse_thread/thread/4c4aedde22fe4594/aeb04288064f495e?show_docid=aeb04288064f495e

+0

यह लगभग लगता है जैसे आप आकर्षित करने में सक्षम होने से अधिक अपडेट प्राप्त कर रहे हैं - क्या आपने इसका परीक्षण करने के लिए 10 सेकंड तक अपडेट की आवृत्ति को कम करने का प्रयास किया है? यदि इससे मदद मिलती है तो आपको प्रत्येक अपडेट के साथ कार्य से कतार को साफ़ करने के लिए समाधान खोजने की आवश्यकता होगी। 2 सेकंड अक्सर होता है यदि आप स्वचालित कचरा संग्रह को 1 सेकंड तक ले सकते हैं (उम्मीद है कि अधिक नहीं) और अन्य सेवाएं भी अपडेट में देरी कर सकती हैं। –

+0

कॉल लगातार हैं, इसलिए पिछले समाप्त होने पर नए लोगों को निष्पादित किया जाता है। – Albert

+0

कचरा कलेक्टर सबसे खराब मामला 200ms से अधिक लेता है, यह 1.5-2 एस यूआई लटकने की तुलना में कुछ भी नहीं है जिसे ऐप प्रत्येक रेड्रा पर अनुभव करता है। रीफ्रेश दर यहां प्रभावित नहीं हो रही है, भले ही मैं इसे 10 के दशक तक बढ़ा दूं, कॉल को निकाल दिया गया है, फिर भी रेड्रो उन 2 सेकंड – Albert

उत्तर

0

मैं तुम्हें यूआरएल कहाँ से अद्यतन मिल जाएगा के रूप में TextView उर एक टैग सेट कर सकते हैं लगता है। और "NotifyDataSetChanged()" को कॉल करने के बजाय, आप findViewByTag (अपडेट यूआरएल) और उस दृश्य के लिए सेटटेक्स्ट का उपयोग करने का प्रयास कर सकते हैं, इसलिए टेक्स्टव्यू केवल बार-बार पूरी सूची को दोबारा नहीं दिखाया जाता है। अतिरिक्त पश्चाताप की संख्या को पर्याप्त रूप से कम करेगा। सिर्फ एक विचार।

1

यह उन लोगों के लिए है जो Google सोच से ब्राउज़ कर रहे हैं, उन्हें अपने डेटा को बदलने की विधि को फिर से लिखना होगा। मेरे डेटा के आधार पर, आपको कई मामलों की आवश्यकता नहीं है।

notifyDataSetChanged() आपके हाथ कोडित प्रतिस्थापन से बहुत तेज़ हो सकता है और यह सब आपके वास्तविक listview कार्यान्वयन पर निर्भर करता है।

नमूना: मेनू चयन के माध्यम से अधिकतम 10K पंक्ति ArrayList अद्यतन के साथ एक साधारण 3-पंक्ति टेक्स्ट-केवल सूचीदृश्य।

मैनुअल notifyDataSetChange()

--- avg run-time: 4ms 

डिफ़ॉल्ट मुक्त notifyDataSetChange()

--- avg run-time: 0ms <--- you can't get faster than this. 

जब तक आप समय और बेंचमार्क अपना सामान अपने स्वयं के प्रतिस्थापन बनाने के लिए भागो मत। आवश्यक होने तक मुफ्त सामान का प्रयोग करें।

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