JavaFX并发-任务仍然冻结UI

时间:2018-10-10 05:22:45

标签: java javafx concurrency task

我尝试在当前应用程序中实现的功能之一是,所选视频的缩略图将显示在ImageView中。我为此使用http://jcodec.org/

因为要花很长时间(〜3 s)从视频中抓取图像,所以我想避免冻结UI以便于用户体验,因此使用JavaFX Task

这是我目前的方法:

@FXML
public void onAddVideoClick(MouseEvent event) {
    final File file = Util.getFileFromFileDialog(
        "Video files (*.avi|*.wmv|*.mov|*.mp4)", "*.avi", "*.wmv", "*.mov", "*.mp4"
    );
    if(file != null) {
        final Task<Image> imageGrabberTask = new Task<Image>() {
            @Override
            public Image call() { return Util.getImageFromVideo(file); }
        };

        imageGrabberTask.setOnSucceeded(e -> {
            Platform.runLater(() -> addVideoView.setImage(imageGrabberTask.getValue()));
        });

        new Thread(imageGrabberTask).run();
    }
}

Util.getImageFromVideo看起来像这样:

public static Image getImageFromVideo(File file) {
    final int frameNumber = 42;
    try {
        final Picture picture = FrameGrab.getFrameFromFile(file, frameNumber);
        final BufferedImage bufferedImage = AWTUtil.toBufferedImage(picture);
        return SwingFXUtils.toFXImage(bufferedImage, null);
    } catch (IOException | JCodecException e) { e.printStackTrace(); return null;}
}

这仍然冻结了我的UI,但我不知道为什么?有什么想法吗?

0 个答案:

没有答案