代号一次绘制失败,因为 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,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()

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