Как остановить SwingWorker, когда файлы списка выпадающих списков отображаются в JList?
У меня есть JList, который показывает список файлов в учетной записи Dropbox (Dropbox API v2).
Распечатка файлов работает с помощью Swingworker, однако я могу автоматически остановить или отменить Swingworker, как только задача будет выполнена.
Я пытался -> task.cancel(true);
но он отменяет задачу до полной загрузки списка в JList. Ниже приведена моя кодировка, которая у меня есть, и я знаю, что я очень близок, но просто не могу понять, как отменить задачу, если она успешно загрузила имена файлов в JList.
Пожалуйста, кто-нибудь может мне помочь с отменой задачи после ее завершения.
private TaskLoadFiles tLoadtask;
private class TaskLoadFiles extends SwingWorker<Void, String>
{
@Override
protected Void doInBackground() throws InterruptedException
{
while (!isCancelled())
{
try
{
ListFolderResult resultdec = client.files().listFolder("/Data/");
//model used to stored the data for display
DefaultListModel modelListFilesdownloaddec = new DefaultListModel();
while (true)
{
for (Metadata metadata : resultdec.getEntries()) {
//adds the data to the model --> gets the file names
modelListFilesdownloaddec.addElement(metadata.getName());
//displays the data from the model into the JList
listFilesDownloadBtndeccloud.setModel(modelListFilesdownloaddec);
}
if (!resultdec.getHasMore()) {
break;
}
resultdec = client.files().listFolderContinue(resultdec.getCursor());
}
}
catch (Exception e)
{
JOptionPane.showMessageDialog(null, "Unable to load cloud files. \nError : " + e, "Cloud Error", JOptionPane.ERROR_MESSAGE);
}
}
return null;
}
@Override
protected void done()
{
tLoadtask.cancel(true);
}
protected void process ()
{
}
}
Как я буду идти о решении этой проблемы. Я прочитал несколько разных веб-страниц, основанных на качелях и вопросах, размещенных на StackOverFlow, но просто не могу решить эту проблему. Возможно, есть проблема с тем, как я реализовал кодировку, что он не может остановиться.
Высоко ценится в продвинутой за вашу помощь
1 ответ
Вы не должны отменить его, когда он завершен. Просто дайте ему вернуться из doInBackground.
Что вы делаете сейчас
while( !cancelled ){ // while #1
while(true){ // while #2
break; // out of while #2 if done
}
}
Это должно быть больше похоже на
while( !cancelled && !done ) // added a "done" flag
{
doYourStuff();
done = isComplete();
}
Отказ от ответственности: вышеуказанные фрагменты не являются допустимыми Java - просто псевдокод для краткости.
Кстати: использование флага "mayInterruptIf Running" (см. JavaDoc) приводит к прерыванию работника (в буквальном смысле). Так что просто установите его false
и цикл перейдет к следующей проверке isCancelled
,