2010-12-07 15 views
7

मेरे पास Android मानचित्र में दिखाने के लिए 458 मार्कर दिखाने का कार्य है। और प्रदर्शन संबंधी मुद्दों से बचने के लिए मैं AsyncTask उदाहरण का उपयोग कर मानचित्र पर डेटा अपडेट करता हूं।एंड्रॉइड मानचित्र: बाध्य अपवाद से बाहर सरणी सूचकांक

यहां मैं जो करता हूं उसका एक छोटा सा परिदृश्य है।

  1. मैं ब्रिटेन के चारों ओर 458 स्थानों के अक्षांश/देशांतर प्राप्त करता हूं।
  2. मैं पाश चलाने के लिए और प्रति एंड्रॉयड ब्लॉग ट्यूटोरियल के रूप में मैं उन्हें ItemizedOverlay वर्ग
  3. में जोड़ने के लिए हर 50 वीं यात्रा के बाद मैं publishProgress विधि कॉल नक्शे में 50 मार्कर जगह।

50 वीं यात्रा प्रवाह publishProgress के माध्यम से onProgressUpdate में चला जाता है और यहाँ के बाद onProgressUpdate विधि

// MapOverLays = mapView.getOverlays(); 
//This line was called in asyc task's constructor 
// Hello Overlay is an instance of ItemizedOverlay. 
mapOverlays.add(helloOverLay); 
//MapView.getController - Also called in Constructor 
controller.setZoom(12); 

controller.animateTo(centerPoint); 
controller.setCenter(centerPoint); 

इस कोड ArrayIndexOutOfBoundException फेंकता है और logcat मेरी मॉड्यूल से वर्ग के किसी भी प्रदर्शित नहीं करता है की मेरी कोड है । अगर यह मेरी समस्या का विस्तार करता है तो यहां लॉगकैट डंप है।

12-07 11:34:48.644: ERROR/AndroidRuntime(508): java.lang.ArrayIndexOutOfBoundsException 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at com.google.android.maps.ItemizedOverlay.getIndexToDraw(ItemizedOverlay.java:211) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at com.google.android.maps.ItemizedOverlay.draw(ItemizedOverlay.java:240) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at com.google.android.maps.Overlay.draw(Overlay.java:179) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at com.google.android.maps.OverlayBundle.draw(OverlayBundle.java:42) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at com.google.android.maps.MapView.onDraw(MapView.java:476) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at android.view.View.draw(View.java:6535) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at android.view.ViewGroup.drawChild(ViewGroup.java:1531) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at android.view.View.draw(View.java:6538) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at android.widget.FrameLayout.draw(FrameLayout.java:352) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at android.view.ViewGroup.drawChild(ViewGroup.java:1531) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at android.view.View.draw(View.java:6538) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at android.widget.FrameLayout.draw(FrameLayout.java:352) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1830) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at android.view.ViewRoot.draw(ViewRoot.java:1349) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at android.view.ViewRoot.performTraversals(ViewRoot.java:1114) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1633) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at android.os.Handler.dispatchMessage(Handler.java:99) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at android.os.Looper.loop(Looper.java:123) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at java.lang.reflect.Method.invoke(Method.java:521) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
12-07 11:34:48.644: ERROR/AndroidRuntime(508):  at dalvik.system.NativeStart.main(Native Method) 

पीएस मैंने 50 के बजाय अपेक्षाकृत छोटे (10) और अपेक्षाकृत बड़े (150) पुनरावृत्तियों के साथ आवेदन का परीक्षण किया है। लेकिन एप्लिकेशन एक ही त्रुटि फेंकता है।

+0

मुझे अस्थायी रूप से समाधान मिल गया है। प्रायः पिन जोड़ने के बजाय मैं पहले पूर्ण डेटा तैयार करता हूं और इसे 'onPostExecute()' का उपयोग करके मानचित्र में जोड़ने के बजाय http://stackoverflow.com/questions/2870743 वर्णित करता हूं लेकिन यह अभी भी लोड करने के लिए समय बचाने के लिए मेरी आवश्यकता को पूरा नहीं करता है सभी पिन हालांकि मैं उस अपवाद से छुटकारा पा सकता हूं। लेकिन किसी भी सुझाव के लिए प्रतीक्षा कर रहा है जो लोडिंग समय में सुधार करता है .... धन्यवाद वैसे भी ... :-) – Prasham

उत्तर

0

मुझे अस्थायी रूप से समाधान मिल गया है। प्रायः पिन जोड़ने के बजाय मैं पहले पूरे डेटा तैयार करता हूं और इसे Android 2.1 GoogleMaps ItemizedOverlay ConcurrentModificationException के रूप में ऑनपोस्टएक्सक्यूट() का उपयोग करके मानचित्र में जोड़ने से जोड़ता हूं लेकिन यह अभी भी सभी पिनों को लोड करने के लिए समय बचाने के लिए मेरी आवश्यकता को पूरा नहीं करता है। हालांकि मैं उस अपवाद से छुटकारा पा सकता हूं। लेकिन लोडिंग समय में सुधार करने वाले किसी भी सुझाव की प्रतीक्षा .... धन्यवाद वैसे भी ... :-)

+0

मुझे मेरे मानचित्रदृश्य के साथ एक ही समस्या है। मैंने अभी तक समस्या में गहरी गोता लगाने के लिए नहीं किया है। क्या आपने पॉप्युलेट कॉल करने से निपटने के ऊपर दिए गए उत्तर की कोशिश की है? – Patrick

3

मुझे एक ही समस्या थी। ऐसा लगता है कि यह बाद में populate पर कॉल किए बिना आइटमized ओवरले में डेटा अपडेट करके हुआ था।


public class ListOverlay extends ItemizedOverlay<OverlayItem> { 
... 
    public synchronized void updateLocations(List<OverlayItem> newLocations) { 
    locations.clear(); 
    locations.addAll(newLocations); 
    populate(); // this was missing 
    } 
    protected synchronized OverlayItem createItem(int index) { 
    return locations.get(index); 
    } 
    public synchronized int size() { 
    return locations.size(); 
    } 
} 

+0

+1 आपके और इसके लिए – Akram

0

मुझे एक ही समस्या है, केवल मुझे थोड़ा अलग स्टैकट्रैक मिलता है। मैंने पाया समाधान आप अपने ओवरले जोड़ने के बाद आपके itemizedOverlay वस्तु को निम्न करने के लिए है:

setLastFocusedIndex(-1); 
populate(); 

मैं इस के लिए ऋण नहीं ले जा सकते हैं, मैं इस सवाल का जवाब here पाया। मुझे नहीं पता कि आपको ऐसा क्यों करना है, लेकिन यह मेरे लिए काम कर रहा है।

1

setLastFocusedIndex (-1); populate();

"हमेशा" काम नहीं !!!

0

प्रत्येक पिन ओवरले में नए पिन आइटम जोड़े जाने के बाद बस यूआई थ्रेड में mapView का अमान्य() कॉल करें।

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