2012-07-18 14 views
6

गतिशील रूप से अपडेट करने के लिए कैसे मैं एक एंड्रॉइड ऐप आधारित एक स्थान विकसित कर रहा हूं जो ओवरले आइटमों से संबंधित है।एक विशिष्ट ओवरलेइटम

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

कार्यान्वयन मेरे पास दो ओवरले हैं। MyLocationOverlay के लिए उपयोगकर्ता स्थान और दूसरा प्रदर्शित करने के लिए, सभी आइटम्स के साथ एक itemizedOverlay उपclass जिसे मुझे मानचित्र पर प्रदर्शित करने की आवश्यकता है।

समस्या जब भी किसी इकाई का स्थान बदल जाता है, तो संबंधित ओवरलेइटम को अद्यतन करने की आवश्यकता होती है। समस्या यह है कि मुझे यकीन नहीं है कि इसे पूरा करने का सबसे अच्छा तरीका कौन सा है। मैं किसी विशेष इकाई का एक स्थान प्राप्त जैसा कि मैंने इन विकल्पों

  1. है, मैं मानचित्र से सभी ओवरले को हटाने और ओवरले फिर से जोड़ें। ओवरलेइटम्स में से एक अब अद्यतन स्थान के साथ बनाया गया है।

    List<Overlay> overlays = map.getOverlays(); 
    overlays.removeAll(overlays); 
    overlays.add(new MyOverlay(marker,this)); 
    
  2. मैं प्रत्येक इकाई के लिए एक ओवरले पैदा करते हैं। मतलब मैं 500 ओवरले बनाउंगा, प्रत्येक में केवल एक ओवरले आइटम होगा। मैं ओवरले क्लास का एक उप वर्ग बनाता हूं और इकाई की पहचान करने और प्रत्येक के लिए एक बनाने के लिए अपनी खुद की गुण जोड़ता हूं। जब मैं किसी विशेष इकाई के स्थान अपडेट तक पहुंचता हूं, तो मैं फिर से चलाता हूं और विशिष्ट ओवरले आइटम प्राप्त करता हूं, इसे हटा देता हूं और अपडेट किए गए स्थान के साथ एक नया जोड़ता हूं।

मुझे नहीं पता कि प्रदर्शन के तरीके का उपयोग करने के लिए सबसे अच्छा कौन सा है।

मैं दूर करने लग रहा है सब और हर एक स्थान अद्यतन के लिए सभी ओवरले (जो अक्सर हो सकता है) हर एक संस्था की काफी एक ओवरहेड जब संस्थाओं की संख्या बन हो जाता है फिर से जोड़ने में 500 से अधिक या 1000

साथ ही, इकाइयों की एक ही संख्या के माध्यम से पुनरावृत्त बराबर ओवरहेड भी हो सकता है।

किसी भी सलाह को चुनने के लिए या इसे लागू करने के बेहतर तरीके की सराहना की जाएगी।

/एंडी

उत्तर

1

मेरा मानना ​​है कि (प्रदर्शन के बारे में) सबसे अच्छा समाधान Overlay वर्ग से एक कस्टम ओवरले वर्ग कि विरासत में बनाने के लिए इतना है कि आप onDraw विधि जिस तरह से आप चाहते हैं ओवरराइड कर सकते हैं। इसे कैसे करें इसे जानने के लिए यह previous SO post देखें। यदि आप इससे बचना चाहते हैं, तो आप ItemizedOverlay देख सकते हैं, अगर आपने पहले से ऐसा नहीं किया है। यह प्रत्येक इकाई के लिए Overlay बनाने से अधिक कुशल है, हालांकि पहले दृष्टिकोण के अनुसार उतना कुशल नहीं है।

+0

तो क्या आप सुझाव देते हैं कि एक कस्टम ओवरले क्लास बनाना और मेरी सभी संस्थाएं उस पर खींची गई हैं? एक बेहतर प्रदर्शन होगा - एक कस्टम ओवरले क्लास जैसा कि आपने सभी 500 इकाइयों या समान कस्टम ओवरले क्लास के साथ सुझाव दिया है, प्रत्येक इकाई के लिए एक (कस्टम ओवरले क्लास की 500 वस्तुएं होंगी) – andy

+3

मेरा मानना ​​है कि कोई निश्चित उत्तर नहीं है यह कस्टम ओवरले वर्ग के कार्यान्वयन पर निर्भर करता है। अगर मैं परफॉर्मेंस के लिए निश्चित रूप से सुनिश्चित करना चाहता हूं, तो मैं इन दो एप्रेच के लिए एक सरल परीक्षण केस लागू करूंगा और देखें कि इनमें से कौन सा सर्वश्रेष्ठ प्रदर्शन है। – Angelo

0

मुझे एक ही समस्या थी, और मैंने जो किया वह आपकी पहली पसंद है।

वैसे भी, उन्हें मानचित्र में जोड़ने से पहले, उन्हें एक अलग थ्रेड पर लोड करें, और सभी छवियों और डेटा लोड होने के बाद, उन्हें मुख्य थ्रेड पर मानचित्र पर जोड़ें।

0

मेरा सुझाव है कि आप अपने ओवरले इटम्स को अपनी इकाइयों के साथ एक हैशसेट में स्टोर करें। जब कोई इकाई अपडेट की जाती है तो आप एक नया ओवरलेइटम बना सकते हैं और इसे सेट में स्टोर कर सकते हैं। चूंकि यह एक सेट है, पुराना ओवरले इटिम हटा दिया जाएगा।

ओवरले इटम्स दिखाने के लिए एक आइटमized ओवरले का उपयोग करें। ItemizedOverlay.createItem(int position) विधि में आप सेट के ओवरलेइटम प्राप्त कर सकते हैं। return set.size() के साथ ItemizedOverlay.getSize() विधि को ओवरराइड करना न भूलें।

प्रत्येक बार जब आप सेट अपडेट करते हैं तो आइटमइज्ड ओवरले पर populate() पर कॉल करें।

अधिक जानकारी के लिए इस Tutorial पर देखें या आपके प्रश्न पूछने पर कोई टिप्पणी पोस्ट करें।

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