如何诊断Android ConcurrentModificationException

时间:2012-12-14 21:25:39

标签: java android concurrency runtime-error

我有一个Android谷歌地图应用程序,我正在通过Eclipse进行调试。我收到了这个错误:

    12-14 16:19:50.106: E/AndroidRuntime(2487): FATAL EXCEPTION: main
12-14 16:19:50.106: E/AndroidRuntime(2487): java.util.ConcurrentModificationException
12-14 16:19:50.106: E/AndroidRuntime(2487):     at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at com.google.android.maps.OverlayBundle.draw(OverlayBundle.java:41)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at com.google.android.maps.MapView.onDraw(MapView.java:494)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at android.view.View.draw(View.java:6740)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at android.view.ViewGroup.drawChild(ViewGroup.java:1640)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at android.view.View.draw(View.java:6743)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at android.widget.FrameLayout.draw(FrameLayout.java:352)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at android.view.ViewGroup.drawChild(ViewGroup.java:1640)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at android.view.View.draw(View.java:6743)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at android.widget.FrameLayout.draw(FrameLayout.java:352)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1842)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at android.view.ViewRoot.draw(ViewRoot.java:1407)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1163)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at android.os.Looper.loop(Looper.java:123)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at android.app.ActivityThread.main(ActivityThread.java:4627)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at java.lang.reflect.Method.invokeNative(Native Method)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at java.lang.reflect.Method.invoke(Method.java:521)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
12-14 16:19:50.106: E/AndroidRuntime(2487):     at dalvik.system.NativeStart.main(Native Method)

我从不显式使用迭代器(我的代码没有,虽然显然有些调用包括一个),并且我确保只能通过Collections.synchronizedList返回的内容访问任何类型的列表,我已经解决了这个问题。由于我不知道我的代码库中会出现什么原因,我无法真正发布代码片段。有谁知道其他“正常”原因?或者如何从logcat打印输出获取任何有意义的位置(据我所知,唯一的文件引用是库文件)?

1 个答案:

答案 0 :(得分:2)

  

我假设它是自动生成的或库代码?

是图书馆代码。

  

我可能会做什么会导致我没写的代码出现问题?

您正在修改在主应用程序线程中迭代的后台线程中的集合,例如通过在后台线程中添加或删除叠加层。

不幸的是,Android版Google地图API的经典版和V2版都不是开源的,因此很难从堆栈跟踪中准确地了解到底发生了什么。我的猜测是你在后台线程中添加或删除叠加层。