Возврат или получение / назначение данных из потока SwingWorker в переменную. начинающий
Я играю с SwingWorker и учусь использовать его. Итак, у меня есть этот код:
ArrayList<Train> dataList = new ArrayList<>();
ArrayList<Train> proccessedData = new ArrayList<>();
String query = "my query, not relevant here";
dataList = myApi.getTrainData(connectServer(), query, false);
TestNewThread tpp = new TestNewThread(dataList, threshold, pairs, false);
tpp.execute();
Мой класс TestNewThread:
public class TestNewThread extends SwingWorker<List, String>{
private ArrayList<Train> dataList;
private int threshold
private int pair
private boolean processFurther)
MyAPI myApi = MyAPI.getInstance();
public TestNewThread(ArrayList<Train> dataList, int threshold, int pair, boolean processFurther) {
this.dataList = dataList;
this.threshold = threshold
this.pair = pair
this.iprocessFurther) = processFurther)
}
@Override
protected List doInBackground() throws Exception {
ArrayList<Train> list;
publish("Starting process");
list = processingTrains(threshold, pair, dataList);
publish("Process finished.");
return list;
}
@Override
protected void process(List<String> chunks) {
String mostRecentValue = chunks.get(chunks.size() - 1);
myApi.printPanel("\n"+mostRecentValue);
}
@Override
protected void done() {
// myApi .printPanel("\nALL DONE... !);
}
Теперь то, что мне нужно, и я не могу понять, как это сделать: На первой части кода здесь, где я tpp.execute();
Я хочу, чтобы он вернулся к назначенной переменной. Чтобы что-то вроде этого, обратите внимание на комментируемый раздел:
ArrayList resultsList = new ArrayList();
TestNewThread tpp = new TestNewThread(dataList, threshold, pairs, false);
resultsList = tpp.execute(); // I know I can't do this because .execute() is void but I want something like whatever the new thread returns to return to resultsList array.
Извините, если в коде есть какая-то опечатка или что-то еще, я просто сделал это сейчас, чтобы объяснить мою проблему. Я думаю, что вы можете получить идею отсюда.
1 ответ
Весь смысл SwingWorker в том, чтобы иметь возможность делать что-то асинхронно, не блокируя поток EDT. Так что вы ничего не можете вернуть из tpp.execute()
потому что если бы вы могли, это означало бы, что EDT будет заблокирован, пока фоновая задача не будет завершена, и фоновая задача больше не будет фоновой задачей.
Однако вы можете передать ссылку на компонент с помощью SwingWorker и вызвать метод этого компонента из метода done():
public class SomePanel extends JPanel {
...
TestNewThread tpp = new TestNewThread(this, dataList, threshold, pairs, false);
tpp.execute();
...
public void backgroundTaskHasFinishedHereIsTheResult(List<Train> trains) {
// TODO do whatever with the list of trains computed by the background task
}
}
И в подклассе SwingWorker:
private SomePanel somePanel;
public TestNewThread(SomePanel somePanel, ArrayList<Train> dataList, int threshold, int pair, boolean processFurther) {
this.somePanel = somePanel;
...
}
@Override
protected void done() {
List<Train> result = get();
somePanel.backgroundTaskHasFinishedHereIsTheResult(result);
}