从Android操作系统本身获取ConcurrentModificationException?

时间:2014-01-27 23:53:04

标签: android screen-rotation

背景

我发现当我在横向模式下启动应用程序时,在旋转到纵向模式后不久,我会得到下一个奇怪的日志:

01-25 02:34:25.253: E/AndroidRuntime(26485): FATAL EXCEPTION: main
01-25 02:34:25.253: E/AndroidRuntime(26485): java.util.ConcurrentModificationException
01-25 02:34:25.253: E/AndroidRuntime(26485):    at java.util.HashMap$HashIterator.remove(HashMap.java:824)
01-25 02:34:25.253: E/AndroidRuntime(26485):    at android.app.ActivityThread.applyConfigurationToResourcesLocked(ActivityThread.java:4096)
01-25 02:34:25.253: E/AndroidRuntime(26485):    at android.app.ActivityThread.handleConfigurationChanged(ActivityThread.java:4159)
01-25 02:34:25.253: E/AndroidRuntime(26485):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1436)
01-25 02:34:25.253: E/AndroidRuntime(26485):    at android.os.Handler.dispatchMessage(Handler.java:99)
01-25 02:34:25.253: E/AndroidRuntime(26485):    at android.os.Looper.loop(Looper.java:176)
01-25 02:34:25.253: E/AndroidRuntime(26485):    at android.app.ActivityThread.main(ActivityThread.java:5419)
01-25 02:34:25.253: E/AndroidRuntime(26485):    at java.lang.reflect.Method.invokeNative(Native Method)
01-25 02:34:25.253: E/AndroidRuntime(26485):    at java.lang.reflect.Method.invoke(Method.java:525)
01-25 02:34:25.253: E/AndroidRuntime(26485):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
01-25 02:34:25.253: E/AndroidRuntime(26485):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
01-25 02:34:25.253: E/AndroidRuntime(26485):    at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:126)
01-25 02:34:25.253: E/AndroidRuntime(26485):    at dalvik.system.NativeStart.main(Native Method)

出现此错误后,我的应用程序崩溃了。

问题

这并不总是会发生,但它也没有显示问题究竟在哪里。此处显示的所有类都不属于我的应用程序。

起初我认为它与我安装了“Xposed”框架的事实有关,但我不确定是什么原因(这个bug很少见)。

问题

还有其他人遇到此错误吗?

它发生了什么?

为什么我看不出问题出在哪里?

2 个答案:

答案 0 :(得分:3)

原因是框架,注销输出在行中指定它:

  

01-25 02:34:25.253:E / AndroidRuntime(26485):at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:126)

当两个线程在使用集合的同时尝试修改集合项时,通常会发生此错误,例如,如果您尝试删除当前正在使用for获取的列表元素(Object对象) :yourtList),并且因为它发生在配置更改之后,我很确定他们正在修改正在使用的列表,这也包含了它不会一直发生的事实。

希望它有所帮助。

问候!

答案 1 :(得分:0)

我的猜测是你的onCreate()方法中的某个位置,当你有一个运行时配置改变时调用,如横向到纵向和反面,有一个HashMap你要插入/删除/迭代它的值。由于您没有粘贴代码,我无法知道它,但是可能还有一个循环,您可以迭代和插入/删除项目,这可能会导致ConcurrentModificationException。或者Thread在后​​台工作,同时在您通过迭代/插入/删除时访问HashMap

如果是循环,请记住不要修改循环内的HashMap - 保留一个额外的数据结构,保存要插入/删除的值,并在循环外执行。

也许this可能有帮助。