2010-12-07 5 views
7

Tengo una tarea para mostrar 458 marcadores para mostrar en los mapas de Android. Y para evitar problemas relacionados con el rendimiento, actualizo los datos en el mapa utilizando una instancia AsyncTask.android maps: índice de matriz fuera de límite excepción

Aquí hay un breve escenario de lo que hago.

  1. Cojo la latitud/longitud de 458 se lugares en todo el Reino Unido.
  2. corro el bucle y de acuerdo con Android Blog tutorial que ellos añaden en ItemizedOverlay clase
  3. Después de cada iteración número 50 que llamo publishProgress método para colocar 50 marcadores en el mapa.

Después de la iteración número 50 el flujo pasa a través de onProgressUpdatepublishProgress y aquí está mi código de onProgressUpdate método

// 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); 

Este código lanza ArrayIndexOutOfBoundException y la Logcat no muestra ninguna de la clase de mi módulo . Aquí está el volcado de logcat si elabora mi problema.

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) 

P.S. He probado la aplicación con iteraciones relativamente más pequeñas (10) y relativamente más grandes (150) en lugar de 50. Pero la aplicación arroja el mismo error.

+0

Tengo temporalmente la solución. En lugar de agregar pines con frecuencia, primero preparo datos completos y luego los agrego en el mapa usando 'onPostExecute()' como se describe en http://stackoverflow.com/questions/2870743 pero aún no cumple con mis requisitos para guardar el tiempo de carga. todos los pines. Sin embargo, puedo deshacerme de esa excepción. Pero a la espera de cualquier sugerencia que mejore el tiempo de carga ... Gracias de todos modos ... :-) – Prasham

Respuesta

0

Tengo temporalmente la solución. En lugar de agregar pines con frecuencia, primero preparo datos completos y luego los agrego al mapa usando onPostExecute() como se describe en Android 2.1 GoogleMaps ItemizedOverlay ConcurrentModificationException, pero aún no cumple con mis requisitos para guardar el tiempo de carga de todos los pines. Sin embargo, puedo deshacerme de esa excepción. Pero a la espera de cualquier sugerencia que mejore el tiempo de carga ... Gracias de todos modos ... :-)

+0

Tengo el mismo problema con mi mapview. Todavía tengo que sumergirme profundamente en el problema. ¿Has probado la respuesta anterior sobre cómo llamar a poblar? – Patrick

3

Tuve el mismo problema. Parece que fue causado por la actualización de los datos en el ItemizedOverlay sin llamar después al populate.


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 a su y para este – Akram

0

He tenido el mismo problema, solo obtengo una stacktrace ligeramente diferente. He encontrado la solución es hacer lo siguiente a su objeto itemizedOverlay después de agregar las plantillas:

setLastFocusedIndex(-1); 
populate(); 

no puedo tomar crédito por esto, he encontrado la respuesta here. No sé por qué tienes que hacer esto, pero está funcionando para mí.

1

setLastFocusedIndex (-1); poblar();

No "siempre" funciona !!!

0

Simplemente llame a invalidar() de mapView en el subproceso de la interfaz de usuario después de que se agreguen elementos de pin nuevos a la superposición cada vez.

Cuestiones relacionadas