Карты Android: индекс массива вне связанного исключения - PullRequest
7 голосов
/ 07 декабря 2010

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

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

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

После 50-й итерации поток переходит в onProgressUpdate через publishProgress, и вот мой код 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);

Этот код выдает 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)

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

Ответы [ 5 ]

3 голосов
/ 21 декабря 2010

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

1 голос
/ 12 мая 2012

setLastFocusedIndex (-1); заполнения ();

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

0 голосов
/ 12 мая 2012

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

0 голосов
/ 06 марта 2012

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

setLastFocusedIndex(-1);
populate();

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

0 голосов
/ 12 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...