2013-08-30 3 views
5

Эти два метода в SwingWorker меня путают в данный момент, и кажется, что их очень легко использовать неправильно.Как правильно используются методы publish() и process() в SwingWorker?

Метод publish() описывает следующее:

Посылает куски данных методу процесса (java.util.List). Этот метод должен использоваться из метода doInBackground для предоставления промежуточных результатов для обработки в потоке отправки событий внутри метода процесса.

Что это значит для меня является то, что в то время как мой рабочий поток выполняет его метод doInBackground(), я могу создать «ломти» (должно ли это быть что-либо конкретным или это просто способ ссылаться на объекты сообщений?) , а затем опубликовать их для обработки на моем графическом интерфейсе Swing.

Это приводит меня к process(). В javadoc представлены следующие данные:

Получает куски данных из метода публикации асинхронно в потоке отправки события.

Просмотрев документацию для обоих методов, может ли кто-нибудь прояснить, за что механизм стоит за тем, как это происходит? Я понимаю, что это асинхронный процесс в соответствии с документацией, но поскольку он происходит на EDT, я представляю, что есть определенная предсказуемость.

В publish() документация говорится это:

Поскольку метод процесса вызывается асинхронно на событие отправки тема несколько вызовов к методу публикации может произойти до того, как метод процесса выполняются. Для целей производительности все эти вызовы объединены в один вызов с помощью конкатенированных аргументов.

Итак, мой вопрос заключается в два раза:

  • Кто должен называть process()?
  • Что такое рабочий процесс для process() в контексте SwingWorker и EDT?

Пожалуйста, дайте мне знать, если требуется какое-либо разъяснение.

+2

'process()' - это обратный вызов. Вам не нужно называть это. 'process()' вызывается в EDT библиотекой. – johnchen902

ответ

3

Я написал программу, которая обрабатывает каталоги в поддереве. Обработка занимает достаточно много времени, чтобы пользователю потребовалась некоторая обратная связь, и что-то происходит. Я открываю диалог, содержащий метку с именем обрабатываемого подкаталога; поток swingworker, называемый publish(), с именем каждого обрабатываемого каталога.

Нет гарантии, что пользовательский интерфейс будет обновлен для каждого имени каталога - иногда обработка идет быстрее, чем повторное отображение, особенно если что-то еще происходит на компьютере и зависит от компьютера, на котором все работает. Поэтому publish() может вызываться и выполняться несколько раз, не вызывая процесс(), вызываемый средой Swing.

Как уже указывалось, процесс не вызывается вашим кодом - он вызывается от вашего имени после вызова публикации и, возможно, не каждый раз, когда вы вызываете publish().

Это ясно для вас?

+0

Так что публикация эффективно делает, чтобы положить свои куски в какую-то очередь, что процесс затем захватывает каждый раз, когда EDT называет его .. это правильный способ взглянуть на него? – Surveon

+2

Да, и время выполнения Swing (не совсем поток) делает что-то с любыми накопленными кусками одновременно, если их больше одного. – arcy

3

Чтобы добавить данные, подлежащие обработке методом process(), вы должны вызвать publish().

Метод публикации можно вызывать из любого потока.

Метод процесса выполняется в пределах потока EDT, поэтому вам разрешено изменять содержимое графического интерфейса, разрешенное только для него, из потока EDT, поэтому вы не должны вызывать метод process() самостоятельно.

Это зависит от вас, чтобы решить, что должен сделать ваш процесс(), но помните, что он работает в потоке EDT, поэтому он должен заканчиваться очень быстро.

Смежные вопросы