2010-12-07 17 views
7

私はAndroidマップに表示するマーカーを458個表示するタスクがあります。パフォーマンスに関連する問題を避けるために、私はAsyncTaskインスタンスを使用してマップ上のデータを更新します。アンドロイドマップ:配列インデックスが境界外の例外

ここに私がしていることの短いシナリオがあります。

  1. 私は、英国周辺の458箇所の緯度経度を取得します。
  2. 私はループを実行し、Androidのブログチュートリアルに従って私はマップ内の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は私のモジュールからのクラスのいずれかを示していないの私のコードです。私の問題を詳述すると、ここに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回です。しかし、アプリケーションは同じエラーをスローします。

+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

私は同じ問題を抱えていましたが、わずかに異なるスタックトレースを取得しました。私は解決策は、あなたのオーバーレイを追加した後、あなたのitemizedOverlayオブジェクトに次の操作を行うことであるが見つかりました:

setLastFocusedIndex(-1); 
populate(); 

私はこのためにクレジットを取ることができない、私は答えhereを発見しました。なぜあなたはこれをしなければならないのかわかりませんが、それは私のために働いています。

1

setLastFocusedIndex(-1); populate();

「常に」動作しません!

0

新しいピンアイテムがその都度オーバーレイに追加された後、UIスレッドでmapViewのinvalidate()を呼び出すだけです。

関連する問題