在代号一中缩放图像时检测到 EDT 违规

EDT violation detected when scaling image in Codename one

我正在尝试开发一个应用程序来显示缩放以适合屏幕大小的任意图像。但是,在 EDT 上缩放图像会显着降低 UI,因此我决定使用以下代码在后台线程中缩放图像。

    final Runnable updateUI = new Runnable() {
        public void run() {
            //Update the UI here
        }
    };
    Runnable r = new Runnable() {
        public void run() {
            Image i = Resources.getGlobalResources().getImage("apple-icon.png");
            i.scaled(50, 40);
            //Display.getInstance().callSerially(updateUI);
            //This line of code is not related to the EDT error
        }
    };
    new Thread(r).start();

但是尽管图像不在 GUI 上(还),模拟器在控制台中显示以下错误(重复数百次,有时会打印不完整的堆栈):

EDT violation detected!
com.codename1.impl.javase.JavaSEPort$EDTViolation: EDT Violation Stack!
    at com.codename1.impl.javase.JavaSEPort.checkEDT(JavaSEPort.java:545)
    at com.codename1.impl.javase.JavaSEPort.getImageWidth(JavaSEPort.java:3945)
    at com.codename1.ui.Image.getWidth(Image.java:689)
    at com.codename1.ui.EncodedImage.getWidth(EncodedImage.java:511)
    at com.codename1.ui.EncodedImage.scaledEncoded(EncodedImage.java:600)
    at com.codename1.ui.EncodedImage.scaled(EncodedImage.java:653)
    at com.mycompany.myapp.MyApplication.run(MyApplication.java:81)
    at java.lang.Thread.run(Thread.java:745)

我想知道这是预期的行为还是我的代码中的错误,以及如何消除此错误?请指教。

尽管有警告,但通常应该可以正常工作,事实上我们的代码正是这样做的,并产生了 EDT 警告。

检测 EDT 违规是不准确的,因为某些 EDT 违规可能会在未到达实施层的情况下发生。这就是为什么我们选择过分渴望并且宁愿拥有 "false positive" 而不是完全错过目标。

请注意,虽然缩放应该适用于 EDT,但某些其他图像处理可能不会。例如。 iOS.

在后台绘制图像可能会严重失败