我使用FXMLController和场景构建器在JavaFX中对此进行编码。 我现在正在创建一个Instagram" liker"主要是为了练习,因为我是计算机科学专业,我只是喜欢编码。
我的问题是,我有一个for循环,"喜欢"每张标签有20张照片,我显然需要延迟,否则我会很快被禁止。用户可以选择延迟,然后我随机化这个延迟,因此它不会太机械化。
我能够使用此延迟的唯一方法是通过thread.sleep方法,但由于我在FXMLController上编码,它会冻结整个UI,并以某种方式阻止其他textareas更新。这显然不太理想。
我到处都试图找到替代方案,但我找不到任何可以在我的程序中运行的东西。
我将给出整个方法:
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张照片,然后加载另一个标签,然后重复。
对此有任何帮助都很棒,谢谢。
答案 0 :(得分:1)
冻结是因为你试图在同一个线程上做所有事情,当你使用Thread.sleep(delays)
时,你实际上是在让你的UI线程进入睡眠状态,因此滞后!
尝试为您的工作使用不同的线程,您可以使用工作线程,如果您正在做的事情不会影响UI
或者您可以使用Platform.runLater(),如果您希望在UI上显示更改!
更多详情: