Как остановить 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,

Другие вопросы по тегам