2010-12-07 5 views
7

j'ai une tâche de montrer 458 marqueurs pour afficher les cartes Android. Et pour éviter les problèmes liés aux performances, je mets à jour les données sur la carte en utilisant une instance AsyncTask.android: Index de tableau hors d'exception liée

Voici un scénario à court de ce que je fais.

  1. Je vais chercher la latitude/longitude de 458 endroits autour du Royaume-Uni.
  2. Je cours la boucle et comme par tutoriel Android Blog je les ajouter dans ItemizedOverlay classe
  3. Après chaque itération 50 j'appelle publishProgress méthode pour placer 50 marqueurs sur la carte.

Après la 50e itération le flux passe en onProgressUpdate via publishProgress et voici mon code de onProgressUpdate méthode

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

Ce code lance ArrayIndexOutOfBoundException et le logcat ne montre pas de la classe de mon module . Voici le vidage de logcat s'il élabore mon problème.

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) 

post-scriptum J'ai testé l'application avec des itérations relativement plus petites (10) et relativement plus grandes (150) au lieu de 50. Mais l'application lance la même erreur.

+0

J'ai temporairement la solution. Au lieu d'ajouter des broches fréquemment, je prépare d'abord des données entières et ensuite je l'ajoute dans la carte en utilisant 'onPostExecute()' comme décrit http://stackoverflow.com/questions/2870743 mais il ne répond toujours pas à mes exigences pour économiser le temps de chargement toutes les broches. Cependant je peux me débarrasser de cette exception. Mais en attendant toutes les suggestions qui améliorent le temps de chargement .... Merci quand même ... :-) – Prasham

Répondre

0

J'ai temporairement obtenu la solution. Au lieu d'ajouter des broches fréquemment, je prépare d'abord des données entières et ensuite je l'ajoute dans la carte en utilisant onPostExecute() comme décrit Android 2.1 GoogleMaps ItemizedOverlay ConcurrentModificationException mais il ne répond toujours pas à mes exigences pour gagner du temps pour charger toutes les broches. Cependant je peux me débarrasser de cette exception. Mais en attendant toutes les suggestions qui améliorent le temps de chargement .... Merci quand même ... :-)

+0

J'ai le même problème avec ma carte. Je n'ai pas encore plongé profondément dans le problème. Avez-vous essayé la réponse ci-dessus traitant d'appeler peupler? – Patrick

3

J'ai eu le même problème. On dirait que cela a été causé par la mise à jour des données dans ItemizedOverlay sans appeler par la suite 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 à votre et pour cela – Akram

0

J'ai eu le même problème, seulement je reçois un stacktrace légèrement différent. J'ai trouvé la solution est de faire ce qui suit à votre objet itemizedOverlay après avoir ajouté vos superpositions:

setLastFocusedIndex(-1); 
populate(); 

Je ne peux pas prendre le crédit pour cela, je l'ai trouvé la réponse here. Je ne sais pas pourquoi tu dois faire ça, mais ça marche pour moi.

1

setLastFocusedIndex (-1); peupler();

pas "toujours" travailler !!!

0

Appelez simplement le invalidate de Mapview() dans thread d'interface utilisateur après de nouveaux éléments de broches sont ajoutés à la superposition à chaque fois.

Questions connexes