android maps : array index out of bound exception

I have a task to show 458 markers to show in Android maps. And to avoid performance related issues I update the data on map using an AsyncTask instance.

Here is a short scenario of what I do.

  • I fetch the latitude/longitude of 458 locations around UK.
  • I run the loop and as per Android Blog tutorial I add them in ItemizedOverlay class
  • After every 50th iteration I call publishProgress method to place 50 markers in map.
  • After the 50th iteration the flow goes into onProgressUpdate via publishProgress and here is my code of onProgressUpdate method

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

    This code throws ArrayIndexOutOfBoundException and the logcat doesn't show any of the class from my module. Here is the logcat dump if it elaborates my problem.

    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)
    

    PS I have tested the application with relatively smaller (10) and relatively larger (150) iterations instead of 50. But the application throws same Error.


    I had the same problem. Looks like it was caused by updating the data in the ItemizedOverlay without calling populate afterwards.

    
    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();
      }
    }
    
    

    setLastFocusedIndex(-1); populate();

    Not "always" work !!!


    I have temporarily get the solution. Instead of adding pins frequently i first prepare whole data and than add it in map using onPostExecute() as described Android 2.1 GoogleMaps ItemizedOverlay ConcurrentModificationException but it still doesn't meet my requirement to save the time to load all pins. However i can get rid of that exception. But waiting for any suggestions that improve the loading time.... Thanks anyway... :-)

    链接地址: http://www.djcxy.com/p/49220.html

    上一篇: 如何根据请求跟踪ASP.NET?

    下一篇: android maps:数组索引超出界限的异常