【发布时间】:2014-12-15 22:08:06
【问题描述】:
我正在使用 JavaFX 的 WebView 来解析网站。该站点包含一堆链接 - 我需要按照给定的顺序分别打开每个链接,并从每个链接中检索一个信息。
为了确保WebView 已加载整个站点,我正在监听WebEngine 的changed 事件并等待newState == Worker.State.SUCCEEDED。问题是这个调用是异步的。当我调用webEngine.load(firstAddress); 时,代码立即返回,在此页面加载之前,我的代码将调用另一个webEngine.load(secondAddress);,依此类推。
我明白为什么要这样做(为什么异步比同步好),但我是 Java 初学者,我不确定解决这个问题的最佳方法是什么。我不知何故了解多线程和东西,所以我已经尝试过信号量(CountDownLatch 类)。但是代码挂在await 上,我不确定我做错了什么。
有人可以告诉我应该如何以正确的方式完成吗?也许一些通用模式如何应对这样的场景?
我想要实现的伪代码:
WebEngine webEngine = new WebEngine();
webEngine.loadPage("http://www.something.com/list-of-cars");
webEngine.waitForThePageToLoad(); // I need an equivalent of this. In the real code, this is done asynchronously as a callback
// ... some HTML parsing or DOM traversing ...
List<String> allCarsOnTheWebsite = webEngine.getDocument()....getChildNodes()...;
// allCarsOnTheWebsite contains URLs to the pages I want to analyze
for (String url : allCarsOnTheWebsite)
{
webEngine.loadPage(url);
webEngine.waitForThePageToLoad(); // same as in line 3
String someDataImInterestedIn = webEngine.getDocument()....getChildNodes()...Value();
System.out.println(url + " : " + someDataImInterestedIn);
}
System.out.println("Done, all cars have been analyzed");
【问题讨论】: