我正在尝试开发一个应用程序,它将显示缩放以适合屏幕大小的任意图像。但是,在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)
我想知道这是预期的行为还是代码中的错误,以及如何摆脱这个错误?请指教。
答案 0 :(得分:0)
尽管有警告,这通常应该有效,事实上我们的代码就是这样做并产生EDT警告。
检测EDT违规是不准确的,因为某些EDT违规可能会在未到达实施层的情况下发生。这就是为什么我们选择过度渴望并且更愿意产生“误报”,而不是完全错过这个标记。
请注意,虽然缩放应该在EDT上工作,但其他一些图像操作可能不会。例如。在iOS中绘制背景图像可能会非常糟糕。