niedziela, 24 marca 2013

Wielowątkowo

Niedawno miałem problem z wypisaniem danych(adresów email,tytułów wiadomości oraz dat otrzymania) do tabeli(TableView), problemem była taka integracja - by TableView uzupełniał się podczas uruchamiania i po jego zakończeniu(jest to o tyle upierdliwe że wiadomości są dość ciężkie i trochę to trwa).
Naturalnym jest sięgnięcie po wielowątkowość - wszystko pięknie, bach wątek: uruchamiamy go w metodzie odpowiedzialnej za inicjalizacje(u mnie jest to "initialize" w kontrolerze).
Tylko co teraz ? na pierwszy rzut oka wszystko powinno działać - od naciśnięcia "run project" dzielą nas już nie minuty a sekundy, odpalamy i ... BUM
NullPointerException...
WTF ? no niestety jak ktoś robi tak jak ja, najpierw naskrobie - potem się dowie, ląduje z nullpointerami i innymi dobrodziejstwami wyjątków. Dziwne było to że TableView wypełniał kilka pierwszych pól(różnie 10-15-30). W momencie którym aplikacja czekała na wykonanie wątku wszystko było ok(prócz czasu uruchamiania, średnio 30sekund).
Na szczęście stackoverflow :* Okazało się że nie możemy modyfikować niczego co pracuje akurat z aktywną sceną - nasz wątek musimy wykonać w wątku aplikacji(javafx application thread), możemy to zrobić za pomocą runLater albo runAndWait.
Po modyfikacji wyglądać to będzie tak:
Jeżeli chodzi o wielowątkowość w JavaFX to materiały o niej nie są jakoś oszałamiające, ale jest nadzieja ! podobno w JDK 8 ma się coś poprawić :)

Brak komentarzy:

Prześlij komentarz