JavaFX在for循环期间暂停,不使用Thread.Sleep()

时间:2014-05-28 19:40:23

标签: java for-loop javafx fxml thread-sleep

我使用FXMLController和场景构建器在JavaFX中对此进行编码。 我现在正在创建一个Instagram" liker"主要是为了练习,因为我是计算机科学专业,我只是喜欢编码。

我的问题是,我有一个for循环,"喜欢"每张标签有20张照片,我显然需要延迟,否则我会很快被禁止。用户可以选择延迟,然后我随机化这个延迟,因此它不会太机械化。

我能够使用此延迟的唯一方法是通过thread.sleep方法,但由于我在FXMLController上编码,它会冻结整个UI,并以某种方式阻止其他t​​extareas更新。这显然不太理想。

我到处都试图找到替代方案,但我找不到任何可以在我的程序中运行的东西。

我将给出整个方法:

    private void start() {
    sleepWhen();
    tagNumber++;
    int delays = Integer.valueOf(delay.getText());
    delays = delays * 1000;
    if (loaded) {
        runTime.clear();
        runTime.appendText("Liking...");
        for (int i = 0; i < 20; i++) {
            webEngine.executeScript("document.getElementsByClassName('btn btn-default btn-xs likeButton')[" + i + "].click()");
            try {
                double random = Math.random() * 1000;
                random = random + delays;
                delays = (int) random;
                System.out.println(delays);
                likes++;
                likesNumber.clear();
                likesNumber.appendText(String.valueOf(likes));
                System.out.println(String.valueOf(likes));
                Thread.sleep(delays);
                delays = Integer.valueOf(delay.getText());
                delays = delays * 1000;

            } catch (InterruptedException ex) {
                //do nothing
            }

            System.out.println("tag number" + tagNumber + "numbertags" + numberTags);
            if (!sleep) {
                if (tagNumber < numberTags) {
                    System.out.println("Loading tag:" + tagNumber);
                    loadTag(tagNumber);
                }
            }
        }
    }
}

这喜欢20张照片,然后加载另一个标签,然后重复。

对此有任何帮助都很棒,谢谢。

1 个答案:

答案 0 :(得分:1)

冻结是因为你试图在同一个线程上做所有事情,当你使用Thread.sleep(delays)时,你实际上是在让你的UI线程进入睡眠状态,因此滞后!

尝试为您的工作使用不同的线程,您可以使用工作线程,如果您正在做的事情不会影响UI

或者您可以使用Platform.runLater(),如果您希望在UI上显示更改!

更多详情:

  1. concurrency in javafx !

  2. Platform.runLater and Task in JavaFX