2008年2月25日月曜日

OverlayController使用時にConcurrentModificationException発生

MapView+OverlayControllerを使用時、頻繁に画面が更新されていると、ConcurrentModificationExceptionが発生する。

-------------------------------------------------------------------------
W/dalvikvm( 1770): threadid=3: thread exiting with uncaught exception (group=0x4
000fdf8)
E/AndroidRuntime( 1770): Uncaught handler: thread Main exiting due to uncaught e
xception
E/AndroidRuntime( 1770): java.util.ConcurrentModificationException
E/AndroidRuntime( 1770): at java.util.AbstractList$SimpleListIterator.nex
t(AbstractList.java:59)
E/AndroidRuntime( 1770): at com.google.android.maps.OverlayBundle.draw(Ov
erlayBundle.java:36)
E/AndroidRuntime( 1770): at com.google.android.maps.MapView.onDraw(MapVie
w.java:337)
E/AndroidRuntime( 1770): at android.view.View.draw(View.java:4574)
E/AndroidRuntime( 1770): at android.view.ViewGroup.drawChild(ViewGroup.ja
va:1089)
E/AndroidRuntime( 1770): at android.view.ViewGroup.dispatchDraw(ViewGroup
.java:915)
E/AndroidRuntime( 1770): at android.view.View.draw(View.java:4550)
E/AndroidRuntime( 1770): at android.view.ViewGroup.drawChild(ViewGroup.ja
va:1089)
E/AndroidRuntime( 1770): at android.view.ViewGroup.dispatchDraw(ViewGroup
.java:915)
E/AndroidRuntime( 1770): at android.view.View.draw(View.java:4550)
E/AndroidRuntime( 1770): at android.widget.FrameLayout.draw(FrameLayout.j
ava:208)
E/AndroidRuntime( 1770): at android.view.ViewGroup.drawChild(ViewGroup.ja
va:1089)
E/AndroidRuntime( 1770): at android.view.ViewGroup.dispatchDraw(ViewGroup
.java:915)
E/AndroidRuntime( 1770): at android.view.View.draw(View.java:4550)
E/AndroidRuntime( 1770): at android.view.ViewGroup.drawChild(ViewGroup.ja
va:1089)
E/AndroidRuntime( 1770): at android.view.ViewGroup.dispatchDraw(ViewGroup
.java:915)
E/AndroidRuntime( 1770): at android.view.View.draw(View.java:4550)
E/AndroidRuntime( 1770): at android.widget.FrameLayout.draw(FrameLayout.j
ava:208)
E/AndroidRuntime( 1770): at android.view.ViewGroup.drawChild(ViewGroup.ja
va:1089)
E/AndroidRuntime( 1770): at android.view.ViewGroup.dispatchDraw(ViewGroup
.java:915)
E/AndroidRuntime( 1770): at android.view.View.draw(View.java:4578)
E/AndroidRuntime( 1770): at android.widget.FrameLayout.draw(FrameLayout.j
ava:208)
E/AndroidRuntime( 1770): at android.view.ViewRoot.draw(ViewRoot.java:531)

E/AndroidRuntime( 1770): at android.view.ViewRoot.performTraversals(ViewR
oot.java:429)
E/AndroidRuntime( 1770): at android.view.ViewRoot.handleMessage(ViewRoot.
java:584)
E/AndroidRuntime( 1770): at android.os.Handler.dispatchMessage(Handler.ja
va:80)
E/AndroidRuntime( 1770): at android.os.Looper.loop(Looper.java:91)
E/AndroidRuntime( 1770): at android.app.ActivityThread.main(ActivityThrea
d.java:3052)
E/AndroidRuntime( 1770): at java.lang.reflect.Method.invokeNative(Native
Method)
E/AndroidRuntime( 1770): at java.lang.reflect.Method.invoke(Method.java:3
56)
E/AndroidRuntime( 1770): at android.os.ZygoteInit$MethodAndArgsCaller.run
(ZygoteInit.java:1547)
E/AndroidRuntime( 1770): at android.os.ZygoteInit.main(ZygoteInit.java:14
45)
E/AndroidRuntime( 1770): at android.dalvik.NativeStart.main(Native Method
)
-------------------------------------------------------------------------


原因はどうやらAPIの使い方が悪かったことらしい。
画面更新中に、OverlayController#add()/clear()を実行してはいけないようだ。

正しい使い方としては、使用するOverlayオブジェクトは初期化時にadd()しておき、その後はadd()/clear()ではなく、activate()/deactivate()を使用して、Overlayのon/offを行うべきだと思われる。