在Codename中缩放图像时检测到EDT违规

时间:2016-12-30 15:48:14

标签: codenameone

我正在尝试开发一个应用程序,它将显示缩放以适合屏幕大小的任意图像。但是,在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$1.run(MyApplication.java:81)
    at java.lang.Thread.run(Thread.java:745)

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

1 个答案:

答案 0 :(得分:0)

尽管有警告,这通常应该有效,事实上我们的代码就是这样做并产生EDT警告。

检测EDT违规是不准确的,因为某些EDT违规可能会在未到达实施层的情况下发生。这就是为什么我们选择过度渴望并且更愿意产生“误报”,而不是完全错过这个标记。

请注意,虽然缩放应该在EDT上工作,但其他一些图像操作可能不会。例如。在iOS中绘制背景图像可能会非常糟糕。