2013-08-30 8 views
5

Te dwie metody w SwingWorker dezorientują mnie w tej chwili i wydaje się, że bardzo łatwo można z nich korzystać nieprawidłowo.W jaki sposób poprawnie stosuje się metody publish() i process() w SwingWorker?

Sposób publish() opisuje:

kawałki wysyła dane do sposobu procesu (java.util.List). Ta metoda ma być używana od wewnątrz metody doInBackground do dostarczania wyników pośrednich do przetwarzania na wątku wywołania zdarzenia wewnątrz metody procesu.

Co to oznacza dla mnie jest to, że podczas gdy mój wątek pracownik wykonuje swoją metodę doInBackground(), jestem w stanie stworzyć „kawałki” (powinno to być coś specyficznego, czy jest to tylko sposób odnosić się do obiektów wiadomość?) , następnie opublikuj je do przetworzenia w moim GUI Swing.

To prowadzi mnie do process(). Jawadok opisuje:

Odbiera porcje danych z metody publikowania asynchronicznie w wątku wywołania zdarzenia.

Po przejrzeniu dokumentacji dla obu metod, czy ktoś mógłby wyjaśnić, jaki mechanizm stoi za tym, jak to się dzieje? Rozumiem, że jest to proces asynchroniczny, jak w dokumentacji, ale ponieważ odbywa się on na EDT, wyobrażam sobie, że istnieje pewna przewidywalność.

W publish() dokumentacja stwierdza tak:

Ponieważ proces metoda jest wywoływana asynchronicznie na wątków zdarzenia Wysłanie wielu wywołań metody publikowania może nastąpić przed metoda proces jest wykonywany. Dla celów wydajności wszystkie te wywołania są połączone w jedno wywołanie z połączonymi argumentami.

Podsumowując, moje pytanie jest dwojakie:

  • Kto powinien być wywołanie process()?
  • Co to jest workflow dla process() w kontekście SwingWorker i EDT?

Proszę dać mi znać, jeśli potrzebujesz wyjaśnienia.

+2

'process()' jest wywołaniem zwrotnym. Nie musisz tego wywoływać. Funkcja 'process()' jest wywoływana w EDT przez bibliotekę. – johnchen902

Odpowiedz

3

Napisałem program, który przetwarza katalogi w poddrzewie. Przetwarzanie trwa wystarczająco długo, aby użytkownik potrzebował informacji zwrotnej, że coś się dzieje. Otworzyłem okno dialogowe zawierające etykietę z nazwą obecnie przetwarzanego podkatalogu; wątek swingworkera o nazwie publish() z nazwą każdego przetwarzanego katalogu.

Nie ma gwarancji, że interfejs użytkownika zostanie zaktualizowany dla każdej nazwy katalogu - czasami przetwarzanie przebiega szybciej niż wyświetlenie ponownie, zwłaszcza jeśli cokolwiek innego dzieje się na komputerze, a także w zależności od komputera, na którym działa. Zatem publish() może zostać wywołane i wykonane kilka razy bez wywoływania procesu() przez środowisko wykonawcze Swing.

Jak już wspomniano, proces nie jest wywoływany przez twój kod - jest wywoływany w twoim imieniu po wywołaniu publikowania, a może nie za każdym razem, gdy wywołujesz publikację().

Czy to ci odpowiada?

+0

Więc to, co efektywnie publikuje to umieszczanie jego fragmentów w jakiejś kolejce, proces ten jest następnie chwytany za każdym razem, gdy EDT nazywa to ... czy to jest właściwy sposób na to spojrzeć? – Surveon

+2

tak, a środowisko wykonawcze Swing (nie tak naprawdę wątek) robi coś z dowolnymi skumulowanymi fragmentami naraz, jeśli jest ich więcej. – arcy

3

Powinieneś wywołać publish(), aby dodać dane do przetworzenia metodą process().

Metodę publikowania można wywołać z dowolnego wątku.

Metoda procesu jest wykonywana w wątku EDT, więc możesz zmieniać rzeczy GUI, które mogą to robić tylko w wątku EDT, dlatego nie powinieneś samodzielnie wywoływać metody process().

Do ciebie należy decyzja, co musi zrobić twój proces(), ale pamiętaj, że działa on w wątku EDT, więc powinien zakończyć się bardzo szybko.

Powiązane problemy