Карты Android: индекс массива вне связанного исключения

У меня есть задача показать 458 маркеров для отображения в картах Android. И чтобы избежать проблем, связанных с производительностью, я обновляю данные на карте, используя экземпляр AsyncTask.

Вот краткий сценарий того, что я делаю.

  1. Я получаю широту/долготу 458 мест по всей Великобритании.
  2. Я запускаю цикл и в соответствии с руководством по блогу Android добавляю их в класс ItemizedOverlay.
  3. После каждой 50-й итерации я вызываю метод publishProgress для размещения 50 маркеров на карте.

После 50-й итерации поток переходит в onProgressUpdate через publishProgress и вот мой код метода 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 не показывает ни одного класса из моего модуля. Вот дамп 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)

P.S. Я протестировал приложение с относительно меньшими (10) и относительно большими (150) итерациями вместо 50. Но приложение выдает ту же ошибку.


person Prasham    schedule 07.12.2010    source источник
comment
Я временно получил решение. Вместо того, чтобы часто добавлять булавки, я сначала подготавливаю целые данные, а затем добавляю их на карту, используя onPostExecute(), как описано stackoverflow.com/questions/2870743, но это все еще не соответствует моему требованию сэкономить время на загрузку всех контактов. Однако я могу избавиться от этого исключения. Но жду любых предложений, которые улучшат время загрузки.... В любом случае спасибо... :-)   -  person Prasham    schedule 08.12.2010


Ответы (5)


У меня такая же проблема. Похоже, это было вызвано обновлением данных в ItemizedOverlay без последующего вызова 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();
  }
}

person beetstra    schedule 21.12.2010

установитьLastFocusedIndex(-1); заполнить();

Не "всегда" работает!!!

person Jeff Fong    schedule 12.05.2012

Я временно получил решение. Вместо частого добавления контактов я сначала подготавливаю целые данные, а затем добавляю их на карту с помощью onPostExecute(), как описано Android 2.1 GoogleMaps ItemizedOverlay ConcurrentModificationException, но это все еще не соответствует моему требованию сэкономить время на загрузку всех контактов. Однако я могу избавиться от этого исключения. Но жду любых предложений, которые улучшат время загрузки.... В любом случае спасибо... :-)

person Prasham    schedule 12.02.2011
comment
У меня такая же проблема с картографией. Мне еще предстоит глубоко погрузиться в проблему. Вы пробовали ответ выше, касающийся вызова заполнения? - person Patrick; 06.03.2012

У меня была такая же проблема, только я получаю немного другую трассировку стека. Я обнаружил, что решение состоит в том, чтобы сделать следующее для вашего объекта itemizedOverlay после добавления ваших наложений:

setLastFocusedIndex(-1);
populate();

Я не могу взять на себя ответственность за это, я нашел ответ здесь. Я не знаю, почему вы должны это делать, но это работает для меня.

person Patrick    schedule 05.03.2012

Просто вызовите недействительную функцию mapView () в потоке пользовательского интерфейса после того, как новые элементы булавки добавляются в оверлей каждый раз.

person Jeff Fong    schedule 12.05.2012