Мое приложение добавляет несколько Runnable
в поток FX, вызывая метод Platform.runlater
, затем я хочу сделать некоторые вычисления только в том случае, если в очереди FX Platform нет дополнительных Runnable
. Но я не знаю правильного пути, есть ли какое-либо событие или механизм обратного вызова, чтобы получить нужное время?
В настоящее время я заставляю прикладную нить беспорядочно спать МИЛЛИЗИРОВАННЫМИ.JavaFX, есть ли обратный вызов для Platform.runlater()?
1
A
ответ
4
Это плохая идея с самого начала, так как вы не знаете, что другой код использует Platform.runLater
. Также вы не должны полагаться на такие детали реализации; для всех, кого вы знаете, очередь никогда не может быть пуста.
Однако вы могли бы разместить эти Runnable
сек, используя пользовательский класс, который отслеживает числа Runnable
с и уведомляет вас, когда все сделано:
public class UpdateHandler {
private final AtomicInteger count;
private final Runnable completionHandler;
public UpdateHandler(Runnable completionHandler, Runnable... initialTasks) {
if (completionHandler == null || Stream.of(initialTasks).anyMatch(Objects::isNull)) {
throw new IllegalArgumentException();
}
count = new AtomicInteger(initialTasks.length);
this.completionHandler = completionHandler;
for (Runnable r : initialTasks) {
startTask(r);
}
}
private void startTask(Runnable runnable) {
Platform.runLater(() -> {
runnable.run();
if (count.decrementAndGet() == 0) {
completionHandler.run();
}
});
}
public void Runnable runLater(Runnable runnable) {
if (runnable == null) {
throw new IllegalArgumentException();
}
count.incrementAndGet();
startTask(runnable);
}
}
Смежные вопросы
- 1. Есть ли обратный вызов для History.pushstate?
- 2. JavaFX using Platform.runLater и SwingUtilities.involkeLater
- 3. Javafx Platform.runLater никогда не работает
- 4. Приложение JavaFx Platform.runLater не отвечает
- 5. Как сделать JavaFX потокобезопасным с Platform.runLater
- 6. Spine - есть ли обратный вызов after_activated
- 7. Есть ли обратный вызов после map.fitBounds?
- 8. Javafx: Разница между javafx.concurent и Platform.runLater?
- 9. Есть ли обратный вызов сбоя Android Beach
- 10. Есть ли обратный вызов AVPlayer 'frameChanged'?
- 11. Как правильно выйти из javaFX Platform.runLater
- 12. Есть ли обратный вызов для ионного sidemenu, когда он закрыт?
- 13. Есть ли всегда обратный вызов для функции Ember.js .then?
- 14. Есть ли обратный вызов для вызова метода Next?
- 15. Есть ли обратный вызов tabLoaded в viewpager для Android?
- 16. Есть ли обратный вызов в режиме ядра для LdrLoadDll?
- 17. Есть ли обратный вызов для метода io.connect() в Socket.IO?
- 18. Есть ли обратный для `tf()`?
- 19. JAVAFX, обратный отсчет не работает
- 20. Использование Platform.runLater для отключения свертывания Аккордеона в JavaFX
- 21. Javafx Обновление пользовательского интерфейса из потока без прямого вызова Platform.runLater
- 22. ли вызов $ .trigger выполнить обратный вызов синхронно
- 23. Есть ли обратный вызов, когда пользователь соглашается предоставить свое местоположение?
- 24. Есть ли способ привязать обратный вызов к элементу объекта C++?
- 25. Есть ли версия $ getJSON, которая не использует обратный вызов?
- 26. Как закончить потоки JavaFX и завершить их при вызове Platform.runLater()?
- 27. Есть ли способ получить уведомление, когда вызывается обратный вызов asyncFetch?
- 28. Есть ли обратный вызов, когда задача выполнена в Task.WhenAll
- 29. Есть ли способ ждать подключения? Обратный вызов? Слушатель?
- 30. Есть ли способ добавить обратный вызов к каждому утверждению?
Я не уверен, что вы пытаетесь достичь. Вся ваша обработка начинается с обратной линии? Platform.runlater запустит код в приложении JavaFX Application Thread вместе с любыми событиями GUI. Я не думаю, что вы можете контролировать графические интерфейсы, кроме как явно заблокировать интерфейс ... – Puce
Еще некоторое описание будет оценено (что вы хотите сделать). Почему вам придется ждать JavaFX, чтобы завершить рендеринг, прежде чем выполнять вычисления? Как проблема случайной нити решала проблему? – GOXR3PLUS
Если вы можете отменить процесс и начать с приложения JavaFX Application Thread, вы можете использовать служебные классы в http://docs.oracle.com/javase/8/javafx/api/javafx/concurrent/package-summary.html для запуска кода в фоновом потоке. – Puce