EDT violation in a thread created by Display.getInstance().startThread()

54 views
Skip to first unread message

Jeff Crump

unread,
Dec 24, 2014, 1:55:20 PM12/24/14
to codenameone...@googlegroups.com
Simulator Issue

I have a successful 1D barcode decoder that I've used in a previous CN1 application that works by scanning an image created by capturePhoto(). I'm revisiting it on further implementation for another application. But on the simulator I received a EDT violation on a thread spawned by Display.getInstance().startThread(). The problem appears during the ImageIO.save(); I didn't think that a task running in a "startThread" could incur an EDT violation.

I've only tried this today on HTC Thunderbolt and LG Intuition, but worked fine on both and came back with a result in less than a second.

    @Override
    protected boolean perform() {
        Capture.capturePhoto(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                final String snapshot = (String) evt.getSource();
                if (snapshot != null) {
                    Display.getInstance().startThread(new Runnable() {
                        public void run() {
                            try {
                                ByteArrayOutputStream output = new ByteArrayOutputStream();
                                ImageIO.getImageIO().save(snapshot, output, ImageIO.FORMAT_JPEG, xDimension, yDimension, quality);
                                Image image = EncodedImage.create(output.toByteArray());
                                if (image != null) {
                                    Image scannedImage = ImageDecoder.FormatImage(image);
                                    int[] picture = scannedImage.getRGB();
                                    int[] decoders = assignDecoders();
                                    ImageDecoder decoder = new ImageDecoder(decoders);
                                    final Result result = decoder.doDecode(picture, scannedImage.getWidth(), scannedImage.getHeight());
                                    setResult(result);
                                }
                                FileSystemStorage.getInstance().delete(snapshot);
                            } catch (IOException ex) {
                                logException("UITaskScanner", ex);
                            }
                        }
                    }, "decoder").start();
                }
            }
        });
        return true;
    }

Rendering frame took too long 265 milliseconds
EDT violation detected!
com.codename1.impl.javase.JavaSEPort$EDTViolation: EDT Violation Stack!
 at com.codename1.impl.javase.JavaSEPort.checkEDT(JavaSEPort.java:384)
EDT violation detected!
EDT violation detected!
EDT violation detected!
EDT violation detected!
EDT violation detected!
 at com.codename1.impl.javase.JavaSEPort.scale(JavaSEPort.java:3234)
 at com.codename1.ui.Image.scale(Image.java:961)
 at com.codename1.ui.Image.scaledImpl(Image.java:931)
 at com.codename1.ui.Image.scaled(Image.java:896)
 at com.codename1.impl.javase.JavaSEPort$53.save(JavaSEPort.java:6170)
 at com.codename1.ui.util.ImageIO.save(ImageIO.java:95)
 at com.crumptech.mobile.crump.ui.tasks.UITaskScanner$2$1.run(UITaskScanner.java:120)

Shai Almog

unread,
Dec 25, 2014, 1:35:32 AM12/25/14
to codenameone...@googlegroups.com
That seems like a false positive. We prefer to err on the side of safety when it comes to violation detection. In this particular usage you should be OK.

Jeff Crump

unread,
Dec 25, 2014, 7:22:31 AM12/25/14
to codenameone...@googlegroups.com
Thanks. CN1 is a very impressive product/service.
Reply all
Reply to author
Forward
0 new messages