由于同时操作ArrayList,Codename One绘制失败



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

[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()

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

最新更新