2010-12-07 1 views
7

Android지도에 표시 할 마커를 458 개 표시하는 작업이 있습니다. 또한 성능 관련 문제를 피하기 위해 AsyncTask 인스턴스를 사용하여지도의 데이터를 업데이트합니다.android maps : 배열 색인 예외를 벗어났습니다

여기 내가하는 일에 대한 간단한 시나리오가 있습니다.

  1. 나는 영국 주변 458 위치의 위도/경도를 가져옵니다.
  2. 나는 루프를 실행하고 안드로이드 블로그 튜토리얼을 따라 난지도 50 개 마커를 배치 할 publishProgress 메소드를 호출 할 때마다 50 반복 한 후 ItemizedOverlay 클래스
  3. 에 추가합니다. 흐름이 여기 publishProgress를 통해 onProgressUpdate로 전환되고 50 반복 후

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 덤프가 있습니다.

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. 필자는 상대적으로 작은 (10) 및 상대적으로 큰 (150) 반복을 사용하여 응용 프로그램을 테스트했지만, 응용 프로그램에서는 동일한 오류가 발생합니다.

+0

일시적으로 해결책을 얻었습니다. 핀을 자주 추가하는 대신에 먼저 전체 데이터를 준비하고 http://stackoverflow.com/questions/2870743에 설명 된대로 onPostExecute()를 사용하여 맵에 추가하지만로드 시간을 절약하기위한 요구 사항을 여전히 충족시키지 못합니다 모든 핀. 그러나 나는 그 예외를 제거 할 수 있습니다. 그러나 로딩 시간을 향상시키는 제안을 기다리고 있습니다. 어쨌든 고마워요. :-) – Prasham

답변

0

일시적으로 해결책을 얻었습니다. 자주 핀을 추가하는 대신에 먼저 전체 데이터를 준비하고 Android 2.1 GoogleMaps ItemizedOverlay ConcurrentModificationException에 설명 된대로 onPostExecute()를 사용하여 맵에 추가하지만 모든 핀을로드하는 데 시간을 절약 할 수는 없습니다. 그러나 나는 그 예외를 제거 할 수 있습니다. 그러나 로딩 시간을 향상시키는 제안을 기다리고 있습니다. 어쨌든 고마워요. :-)

+0

나는 내 mapview에 같은 문제가 있습니다. 나는 아직 문제에 깊이 빠져들지 못했다. populate를 호출하는 위의 응답을 시도 했습니까? – Patrick

3

동일한 문제가있었습니다. 나중에 populate을 호출하지 않고 ItemizedOverlay의 데이터를 업데이트 한 것으로 보입니다.


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은 당신과 당신에게 달려 있습니다. – Akram

0

저는 같은 문제가 있었지만 약간 다른 스택 추적 만 받았습니다. 나는이에 대한 크레딧을받을 수 없어

setLastFocusedIndex(-1); 
populate(); 

, 내가 대답 here을 발견 : 나는 당신이 당신의 오버레이를 추가 한 후 솔루션이 당신의 itemizedOverlay 객체에 다음을 수행하는 것입니다 발견했다. 왜 당신이 이것을해야하는지 모르겠지만 그것은 나를 위해 일하고 있습니다.

1

setLastFocusedIndex (-1); populate();

"항상"작동하지 않습니다!

0

매번 새로운 핀 항목이 오버레이에 추가 된 후 UI 스레드에서 mapView의 invalidate()를 호출하기 만하면됩니다.