由于并发操作 ArrayList,代号 One 绘制失败

Codename One paint fails because of concurrent manipulation of ArrayList

在模拟器中自动测试我的应用程序时,偶尔(而且很少)我会遇到这样的错误:

[EDT] 0:24:35,723 - Exception: java.lang.IndexOutOfBoundsException - Index: 12, Size: 13
[EDT] 0:24:35,725 - Exception in MyApp version 2.0
[EDT] 0:24:35,725 - OS ios
[EDT] 0:24:35,725 - Error java.lang.IndexOutOfBoundsException: Index: 12, Size: 13
[EDT] 0:24:35,725 - Current Form Main
[EDT] 0:24:35,725 - Exception: java.lang.IndexOutOfBoundsException - Index: 12, Size: 13
    at java.util.ArrayList.rangeCheck(ArrayList.java:657)
    at java.util.ArrayList.get(ArrayList.java:433)
    at com.codename1.ui.Container.paint(Container.java:1851)
    at com.codename1.ui.Component.internalPaintImpl(Component.java:2279)
    at com.codename1.ui.Component.paintInternalImpl(Component.java:2252)
    at com.codename1.ui.Component.paintInternal(Component.java:2227)
    at com.codename1.ui.Container.paintIntersecting(Container.java:1907)
    at com.codename1.ui.Component.paintIntersectingComponentsAbove(Component.java:2312)
    at com.codename1.ui.Component.internalPaintImpl(Component.java:2287)
    at com.codename1.ui.Component.paintInternalImpl(Component.java:2252)
    at com.codename1.ui.Component.paintInternal(Component.java:2227)
    at com.codename1.ui.Component.paintInternal(Component.java:2195)
    at com.codename1.ui.Component.paintComponent(Component.java:2492)
    at com.codename1.ui.Component.paintComponent(Component.java:2436)
    at com.codename1.impl.CodenameOneImplementation.paintDirty(CodenameOneImplementation.java:625)
    at com.codename1.impl.javase.JavaSEPort.paintDirty(JavaSEPort.java:2247)
    at com.codename1.ui.Display.edtLoopImpl(Display.java:1286)
    at com.codename1.ui.Display.mainEDTLoop(Display.java:1189)
    at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120)
    at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176)

所以看起来绘制是与组件 ArrayList 的操作(删除和添加元素)同时完成的。 我有一个后台线程,它通过调用通常由按下按钮触发的函数来模拟用户输入。 所有调用都包含在 callSerially 中。

我无法通过正常的用户输入(按下按钮)重现此错误,但我仍然想确保这不会发生 在正常使用过程中。所以我想知道是什么原因造成的,以及如何预防。

这可能意味着您的代码某处存在 EDT 违规。确保你 运行 使用模拟器中的 EDT 违规检测工具来尝试解决这个问题。

如果在动画期间发生这种情况,请尝试将 revalidate() 的用法切换为 revalidateWithAnimationSafety()

如果这些都没有帮助,请尝试缩小触发此问题的代码范围。