7

Android マップに表示する 458 個のマーカーを表示するタスクがあります。AsyncTaskパフォーマンス関連の問題を回避するために、インスタンスを使用してマップ上のデータを更新します。

これが私がしていることの短いシナリオです。

  1. 英国周辺の 458 か所の緯度/経度を取得します。
  2. ItemizedOverlayループを実行し、Android ブログのチュートリアルに従ってクラスに追加します
  3. 50 回の反復ごとにメソッドを呼び出しpublishProgressて、50 個のマーカーをマップに配置します。

50 回目の繰り返しの後、フローはonProgressUpdateviaに入り、これがメソッド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)

PS 50 ではなく、比較的小さい (10) および比較的大きい (150) 反復でアプリケーションをテストしました。しかし、アプリケーションは同じエラーをスローします。

4

5 に答える 5

3

私も同じ問題を抱えていました。後で呼び出さずに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();
  }
}

于 2010-12-21T15:26:46.407 に答える
1

setLastFocusedIndex(-1); populate();

「常に」機能するわけではありません!!!

于 2012-05-12T13:58:21.167 に答える
0

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

于 2012-05-12T14:05:43.720 に答える
0

私は一時的に解決策を得ました。ピンを頻繁に追加する代わりに、最初にデータ全体を準備し、Android 2.1 GoogleMaps ItemizedOverlay ConcurrentModificationExceptionで説明されているように、onPostExecute() を使用してマップに追加しますが、すべてのピンをロードする時間を節約するという要件をまだ満たしていません。ただし、その例外を取り除くことができます。しかし、読み込み時間を改善する提案を待っています....とにかくありがとう... :-)

于 2011-02-12T06:03:15.560 に答える
0

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

setLastFocusedIndex(-1);
populate();

私はこれを手柄にすることはできません。私はここで答えを見つけました。なぜこれをしなければならないのかわかりませんが、私にとってはうまくいっています。

于 2012-03-05T22:09:24.960 に答える