Java SwingWorker doInBackground() 是否有可能在继续之前等待中间过程完成
Is it possible for a Java SwingWorker doInBackground() to wait for an Interim Process to be completed before continuing
我目前正在使用 SwingWorker
来防止 Swing GUI 在执行需要一段时间才能完成的任务(Web 抓取)时挂起。此外,我从 doInBackground()
调用 publish()
方法将临时数据块发送到 process 方法,如下面的示例代码所示。但是,这给我带来了问题,因为处理方法是异步完成的,有时会被新的数据块覆盖,从而导致某些数据消失。是否可以告诉 doInBackground()
等待 process/publish 方法完成并确保在继续并可能覆盖以前的数据之前按要求处理和使用数据?
class validateSources extends SwingWorker<Void, Integer> {
@Override
protected Void doInBackground() throws Exception {
for (int i = 0; i < size; i++) {
//Do some webscraping here
//Publish the data to the process method
publish(webscrapingData);
}
}
@Override
protected void process(List<Integer> chunks) {
//Use WebscrapingData for something
Object webscraingData = chunks.get(0);
}
}
编辑:
我注意到我之前提供的细节还不够。我目前遇到的问题是,在 doInBackground() 中继续下一次迭代之前,对从 doInBackground() 发布的数据进行完全处理至关重要。因此,我正在寻找一种方法来确保 process() 中的代码在进行下一次 Webscraping 迭代之前完全完成。
阅读 Tasks That Have Interim Results 上的 Swing 教程部分。您会发现一条声明:
多次调用 publish 的结果通常会累积到单次调用 process 中。
Object webscraingData = chunks.get(0);
您只处理一个项目。
您需要遍历列表中的所有项目。
我目前正在使用 SwingWorker
来防止 Swing GUI 在执行需要一段时间才能完成的任务(Web 抓取)时挂起。此外,我从 doInBackground()
调用 publish()
方法将临时数据块发送到 process 方法,如下面的示例代码所示。但是,这给我带来了问题,因为处理方法是异步完成的,有时会被新的数据块覆盖,从而导致某些数据消失。是否可以告诉 doInBackground()
等待 process/publish 方法完成并确保在继续并可能覆盖以前的数据之前按要求处理和使用数据?
class validateSources extends SwingWorker<Void, Integer> {
@Override
protected Void doInBackground() throws Exception {
for (int i = 0; i < size; i++) {
//Do some webscraping here
//Publish the data to the process method
publish(webscrapingData);
}
}
@Override
protected void process(List<Integer> chunks) {
//Use WebscrapingData for something
Object webscraingData = chunks.get(0);
}
}
编辑:
我注意到我之前提供的细节还不够。我目前遇到的问题是,在 doInBackground() 中继续下一次迭代之前,对从 doInBackground() 发布的数据进行完全处理至关重要。因此,我正在寻找一种方法来确保 process() 中的代码在进行下一次 Webscraping 迭代之前完全完成。
阅读 Tasks That Have Interim Results 上的 Swing 教程部分。您会发现一条声明:
多次调用 publish 的结果通常会累积到单次调用 process 中。
Object webscraingData = chunks.get(0);
您只处理一个项目。
您需要遍历列表中的所有项目。