2015-10-02 2 views
0

Если вы установите бесконечный цикл в JavaFX-Launcher Thread, ваше приложение никогда не запустится. Из того, что я знаю, он работает на другом Thread, так почему это происходит?Loop в JavaFX-Launcher, предотвращающий запуск прикладного потока JavaFX

Просто создайте новый проект и переопределите init() и добавьте цикл forever.

// Mine is not forever 
boolean go = true; 

@Override 
public void init() throws Exception { 

    // TODO Auto-generated method stub 
    super.init(); // 'while' comes after this line 

    while(go){} // Comment this guy and everything is ayt 
} 

@Override 
public void stop() throws Exception { 

    // TODO Auto-generated method stub 
    go = false; 
    super.stop(); 
} 

Означает ли это, что JavaFX-Launcher Thread должен выйти, прежде чем приложение UI может начать - (т.е. javaFxApplication Thread), или я что-то не хватает?

Если JavaFX-Launcher должен стать альтернативой для запуска приложения необходимо до начала приложения, почему оно не может быть одновременно, потому что, если я хочу, чтобы это было в последовательностях я просто разместить код перед методом super.init()?

+1

Почему вы ожидаете, что приложение запустится, если задача инициализации для него никогда не заканчивается? – jewelsea

+0

У меня возникла другая мысль о том, как она работала изначально - поэтому это предположение – Elltz

ответ

2

Прямое объяснение того, что происходит

Документация для метода применения start прямо говорится, что происходит:

Метод запуска вызывается после того, как метод инициализации вернулся, и после того, как система готова для запуска приложения.

Итак, если вы запускаете бесконечный цикл в методе init, который никогда не возвращается, ваше приложение никогда не запустится.

Дополнительная документация по жизненному циклу приложения приведена в javaadoc Application.

Некоторые отступлений, спекуляции и, возможно, связано информация

Следующая информация может или не может иметь отношение к вашей проблеме под рукой.

Я считаю, что идея метода init заключается в том, что вы можете поместить логику в метод init, который может выполняться, когда сама система JavaFX инициализируется. Инициализация системы JavaFX занимает некоторое время, хотя в современной системе обработки я бы не ожидал, что это будет очень длительное время (например, менее секунды).

Большинство приложений JavaFX, которые я видел, мало используют метод init.

Если ваша инициализация длительная и вы хотите, чтобы приложение запускалось быстро даже до завершения инициализации, для его обработки вам понадобится явная логика.

Например, создайте JavaFX Task в методе init, который запускается в его собственном потоке. Выполните инициализацию там. В вашем методе начала отображается пользовательский интерфейс с ограниченной функциональностью. Как только ваша инициализация будет полностью завершена (что может быть известно слушателю о состоянии вашей задачи инициализации), включите полностью функциональный пользовательский интерфейс, который зависит от того, какие данные из инициализации будут полностью доступны. Хотя это не совсем то же самое (поскольку он запускает некоторую логику Task от начала, а не init), очень похожий пример этого подхода находится в этом примере, который «Displays a JavaFX splash page for an intensive startup task with progress monitoring».

JavaFX имеет концепцию Preloader, которая предоставляет встроенную инфраструктуру для обработки длительной инициализации, однако я не видел ее широко используемой. Сам Preloader ориентирован главным образом на Java, встроенный в веб-страницу через плагин или Java Web Start. Это не технологии, которые много используются в сочетании с JavaFX. Большинство приложений JavaFX представляют собой автономные приложения, не полагающиеся на плагины веб-страниц или веб-запуск для их выполнения). Вы можете использовать инфраструктуру Preloader для инициализации вашего приложения (даже если оно работает в автономном режиме), но, вероятно, проще просто использовать задачу для этой цели. Для получения дополнительной информации об использовании Preloader вы можете обратиться к: How to use javaFX Preloader with stand-alone application in Eclipse? (обратите внимание, что ответ на этот вопрос не является специфичным для Eclipse, хотя вопрос есть).

+0

на самом деле метод 'super.init()' ничего не делает, просто помогает вам реализовать свои пользовательские логики и о да я знал о предзагрузчике, просто не хочу его использовать, и даже предварительный загрузчик работает в том же потоке, что и 'init();', спасибо за ваш ответ, он заставил меня разогнать исходный код, который достаточно подробно, и ваш ответ поддерживает его, метод start вызывается после init() и до тех пор, пока .. – Elltz

1

У меня нет опыта работы с javafx в частности, но когда что-то в этом роде происходит, это контрольный признак того, что вы работаете в типичной управляемой событиями системе, в которой есть цикл сообщений для запуска.

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

Вам нужно будет либо разгрузить работу, которая вам нужна, либо сделать другой поток, либо вам нужно будет найти способ разбить ее на фрагменты, которые будут выполняться по частям на каком-либо событии таймера или в каком-либо праздном событии, независимо от того, ваша среда поддерживает.

+0

я обязательно разгружу мою работу :) – Elltz