JavaFX UI Thread block

lam_tr

Top Contributor
Hallo zusammen,

irgendwie bekomme ich trotz UI Thread via Runnable, TimerTask, Task, Platform.runLater Varianten trotzdem UI Freeze, obwohl anwendungsmäßig nicht viel beansprucht wird.

Woran kann es liegen`?

Was wird gemacht? Ich habe eine ListView, sobald ich auf ein Item selektiere wird in der Datenbank ein select mit der Id gemacht und gibt eine Liste der Ergebnisse und stellt sie in eine zweite ListView dar. Die Oberfläche hängt trotzdem immer ca. 3-5 Sekunden auf.

Wenn ich den Task in ein Thread packe und per start mache, funktioniert das verzögert, aber dann müsste ich in den call methode noch Platform.runLater rein machen, sonst kann ich die zweite ListView nicht updaten.

hier ein kleiner Ausschnitt
Java:
        documentTable.selectionModel.selectedItemProperty.addListener [
            val selection = documentTable.selectionModel.selectedItem
            nameLabel.textProperty.bind(selection.nameProperty)
            createdLabel.textProperty.bind(Bindings.convert(selection.create_timestampProperty))
            statusLabel.textProperty.bind(Bindings.convert(selection.statusProperty))
            statusTextLabel.textProperty.bind(Bindings.convert(selection.statustextProperty))
            updateLabel.textProperty.bind(Bindings.convert(selection.update_timestampProperty))
            fileList.items.clear
           
            new Thread(new DocFileUpdaterTask(fileList, selection.id)).start
        ]

Code:
class DocFileUpdaterTask extends Task<Void> {
   
    ListView<DocumentFile> listView
   
    @Accessors int id
       
    new(ListView<DocumentFile> listView, int id) {
        this.listView = listView
        this.id=id
    }
   
    override protected call() throws Exception {
        Platform.runLater[
            listView.items.clear
            listView.items += ApplicationConfig.Instance.docFileDao.getDocFilesByDocId(id)
        ]
        null
    }
   
}

Bitte schaut nicht so streng auf den Code, das ist syntaktisch ein bisschen abweichend zu Java (Xtend). Es geht mir mehr oder weniger um den Inhalt wie ich das lösen kann, damit die UI beim Holen der Daten die UI nicht einfriert.

Datenmäßig sind noch nicht so viele in der Datenbank. Überschaubar ca. 20 Entries, verbraucht trotzdem 2-5 sekunden zum Laden.

Viele Grüße
lam
 

mrBrown

Super-Moderator
Mitarbeiter
Das Abfragen aus der Datenbank sollte nicht in runLater passieren. Du kannst die Items vorher in einer anderen Liste speichern, und in runLater nur das Adden.

Ich würde da tendenziell noch weiter trennen, und mit extra Model und Listenern arbeiten, das runLater kann dann in die GUI-Klassen ausgelagert werden, und steht nicht mehr in deiner Logik
 

lam_tr

Top Contributor
Hallo @mrBrown ,

ich habe das ursprünglich bei dem SelectionChange der Listview das holen der Items in eine Liste gepackt. Also in der Form

documentTable.selectionModel.selectedItemProperty.addListener [
val selection = documentTable.selectionModel.selectedItem
nameLabel.textProperty.bind(selection.nameProperty)
createdLabel.textProperty.bind(Bindings.convert(selection.create_timestampProperty))
statusLabel.textProperty.bind(Bindings.convert(selection.statusProperty))
statusTextLabel.textProperty.bind(Bindings.convert(selection.statustextProperty))
updateLabel.textProperty.bind(Bindings.convert(selection.update_timestampProperty))
fileList.items.clear

listView.items.clear
listView.items += ApplicationConfig.Instance.docFileDao.getDocFilesByDocId(id)
]

Aber die Oberfläche friert genauso ein. Ich bin mir da ziemlich sicher dass beim Abfragen der Daten das Einfrieren verursacht. Das komische ist nur dass die Abfrage nicht so lange brauchen soll, da sie noch so gut wie noch leer ist.

Vielen Dank für die Antwort.

lam
 

mrBrown

Super-Moderator
Mitarbeiter
Weil das Holen immer noch im UI-Thread passiert.

Das ganze in einen Thread auszulagern macht schon Sinn - und der sollte die GUI benachrichtigen, *nachdem* die Daten aus der Datenbank bezogen worden sind.
 

lam_tr

Top Contributor
@mrBrown
Aber diese Variante mit Auslagerung hat den selben Effekt?

Java:
documentTable.selectionModel.selectedItemProperty.addListener [
val selection = documentTable.selectionModel.selectedItem
nameLabel.textProperty.bind(selection.nameProperty)
createdLabel.textProperty.bind(Bindings.convert(selection.create_timestampProperty))
statusLabel.textProperty.bind(Bindings.convert(selection.statusProperty))
statusTextLabel.textProperty.bind(Bindings.convert(selection.statustextProperty))
updateLabel.textProperty.bind(Bindings.convert(selection.update_timestampProperty))
fileList.items.clear

val thread = new Thread(new DocFileUpdaterTask(fileList, selection.id)).run
]
 

lam_tr

Top Contributor
Doch das Runnable wird als Parameter dem Thread übergeben und ausgeführt. In dem Runnable werden die Daten, siehe oben geholt und gesetzt.
 

lam_tr

Top Contributor
@mrBrown
Ok ich habe jetzt die Liste Initial komplett geladen und sobald etwas selektiert wird, wird die Liste gefiltert. Wirkt auf jeden Fall viel flüssiger.

Weiter hätte ich eine Frage wie man am Besten das macht. Wenn ich neue Elemente hinzufüge oder bestehende Lösche, mache ich dann ein Insert/Delete, soll dann die Entries komplett wieder in die Liste gelaen werden, oder ich mach ein add/remove auf die Liste?
 

mrBrown

Super-Moderator
Mitarbeiter
Kommt drauf an, ist beides möglich. Wird die Datenbank denn extern verändert?

Wenn ja, führt kein Weg dran vorbei, daraus jedes Mal zu aktualisieren (außer man möchte dem Nutzer die Wahl lassen).
Wenn nein, kann man die Daten im Programm halten und diese nutzen, aber zusätzlich asynchron die Datenbank aktualisieren bzw abgleichen. UI hat dann keine Verzögerung durch die DB, aber Daten sind trotzdem aktuell.
UU bietet sich auch n einfacher Cache an.

Generell würde ich GUI und Model möglichst weit trennen, das ist in deinem Code vermutlich noch nicht genug. Dann sind die Umsetzungen für die UI gleichwertig, und du kannst auch einfach zum testen mal zwischen verschiedenen Varianten wechseln
 

lam_tr

Top Contributor
Vielen Dank für diesen konstruktiven Kommentar. Das mit dem Asynchronen Aktualisierung gefällt mir.

Hast du Tipps für mich wie man GUI mit Model noch besser trennen kann? Weil ich denke dieses Prinzip habe ich auch noch nicht wirklich 100% verstanden.

Grüße
lam
 

mrBrown

Super-Moderator
Mitarbeiter
Hast du Tipps für mich wie man GUI mit Model noch besser trennen kann? Weil ich denke dieses Prinzip habe ich auch noch nicht wirklich 100% verstanden.
Eher theoretische Tipps helfen dir dann vermutlich jetzt nicht wirklich weiter?

In dem Programm jetzt gehts um irgendwas mit Dokumenten?
Dann könnte man zB eine Klasse Documents haben, die den Zugriff auf Dokumente kapselt. Die enthält dann alle geladenen Dokumente und für diese gibt es einen getter und zB eine filter, gleichzeitig ist die Observable.
Die GUI kennt dann nur ein Objekt dieser Klasse und ist dort als Observer eingetragen, wenn sich was ändert holt sie sich jeweils die Dokumente und zeigt sie an. Wenn gesucht wird, ruft sie filter auf, das filtert im Hintergrund, und wenn die GUI dann wieder mitbekommt, das sich was geändert hat, zeigt sie es wieder an
 

mrBrown

Super-Moderator
Mitarbeiter
Jein, ich würde DAO als Trennung von Model und DB nutzen.
Dao halte ich immer möglichst Simple, zB Synchron statt Asynchron und nur als Datenlieferant. Das das kommt erst in Model, welches die Logik enthält, und das Dao zum Beziehen der Daten nutzt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P thread nimmt veränderte boolean nicht AWT, Swing, JavaFX & SWT 7
N JFrame loescht alles, sobald der Thread zuende ist AWT, Swing, JavaFX & SWT 22
M Server/Client thread von GUI Trennen AWT, Swing, JavaFX & SWT 2
K JavaFx, Sound Aufnahme und Thread AWT, Swing, JavaFX & SWT 0
T Exception in thread "main" java.lang.NoClassDefFoundError AWT, Swing, JavaFX & SWT 4
G Exception javafx Thread -> caused by removing children while in EventHandler AWT, Swing, JavaFX & SWT 28
H Event Handling Thread - Abruf der get-Methode AWT, Swing, JavaFX & SWT 5
J "Exception in thread "AWT-EventQueue-0"" Fehler AWT, Swing, JavaFX & SWT 3
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
C Thread verwalten AWT, Swing, JavaFX & SWT 2
A Swing Exception in thread "AWT-EventQueue-0" AWT, Swing, JavaFX & SWT 1
S JavaFX Exception in thread "JavaFX Application Thread" AWT, Swing, JavaFX & SWT 3
L Label im JavaFX Thread Updaten AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Alert Confirmation Dialog aus einem Service Thread AWT, Swing, JavaFX & SWT 8
ralfb1105 JavaFX MVC: Thread in Model Class mit Ausgabe in TextArea AWT, Swing, JavaFX & SWT 10
D Swing SwingUtils / Thread Problem AWT, Swing, JavaFX & SWT 3
J Thread per Button starten AWT, Swing, JavaFX & SWT 10
J Thread kennt JButton nicht. AWT, Swing, JavaFX & SWT 11
T JavaFX Task / Thread / FXThread Komplikationen AWT, Swing, JavaFX & SWT 5
O Swing Event Dispatch Thread AWT, Swing, JavaFX & SWT 1
X Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1 AWT, Swing, JavaFX & SWT 6
sandaime Swing Thread für CMD auslesen AWT, Swing, JavaFX & SWT 16
E JavaFX JavaFX Application in Thread ausführen AWT, Swing, JavaFX & SWT 1
D JavaFX UI-Thread und DB-Thread trennen um z.B. Ladebalken anzuzeigen AWT, Swing, JavaFX & SWT 15
T JavaFX Controller im extra Thread AWT, Swing, JavaFX & SWT 0
T Swing 2 Thread.sleep parallel laufen lassen AWT, Swing, JavaFX & SWT 4
L Zweites Fenster mit Thread AWT, Swing, JavaFX & SWT 0
E JavaFX Stage.show() in ursprünglichem Thread starten AWT, Swing, JavaFX & SWT 7
L Swing Frame in Thread wird nicht gezeichnet AWT, Swing, JavaFX & SWT 2
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
C Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen AWT, Swing, JavaFX & SWT 2
C Thread-/ Simulations- Problem AWT, Swing, JavaFX & SWT 18
T Swing Button bleibt grau [=> UI hat sich aufgehängt, Aufgabe in Thread auslagern] AWT, Swing, JavaFX & SWT 3
M Thread-Frage in SWT AWT, Swing, JavaFX & SWT 1
Q GUI außerhalb GUI-Thread updaten - GUI friert ein AWT, Swing, JavaFX & SWT 18
C Thread in Klassen starten AWT, Swing, JavaFX & SWT 4
L exception in thread awt-eventqueue-0 java.lang.nullpointerexception AWT, Swing, JavaFX & SWT 2
S Swing Exception in thread "AWT-EventQueue-0" bei Jlabel AWT, Swing, JavaFX & SWT 4
D SWT SWT Elemente aus anderen Klassen aufrufen - Invalid thread access AWT, Swing, JavaFX & SWT 6
K JavaFX Tableview mit fxml ohne Aktualiserung trotz Thread AWT, Swing, JavaFX & SWT 13
K Event Handling 2 Buttons und Thread stop AWT, Swing, JavaFX & SWT 3
C Swing Update von swing-TableModels per Thread. Eins geht, das andere nicht, warum? AWT, Swing, JavaFX & SWT 12
V JLabel bzw. GUI aus externen Thread ansteuern AWT, Swing, JavaFX & SWT 3
J Applet Paralleles Thread Handling AWT, Swing, JavaFX & SWT 3
H Swing JfreeChart aktualisieren - mit daten aus thread AWT, Swing, JavaFX & SWT 3
T Java Swing Main GUI Thread AWT, Swing, JavaFX & SWT 3
C Event Handling Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException AWT, Swing, JavaFX & SWT 43
T Table-Zeilen mit Thread einfärben AWT, Swing, JavaFX & SWT 15
F Swing GUI-Thread für automatisches Update nutzen AWT, Swing, JavaFX & SWT 10
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
V Nullpointerexception (etwas mit thread und jframe) AWT, Swing, JavaFX & SWT 3
P Problem Thread.sleep() und JProgressBar AWT, Swing, JavaFX & SWT 7
S SWT GUI-Thread AWT, Swing, JavaFX & SWT 11
A Thread und sleep(1000); AWT, Swing, JavaFX & SWT 7
B Swing Thread+Animation AWT, Swing, JavaFX & SWT 7
S Timer oder Thread.sleep AWT, Swing, JavaFX & SWT 3
M Exception in thread "Thread-3" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 18
B Über SWT Button Thread beenden AWT, Swing, JavaFX & SWT 2
C SWT Gui Thread hängt sich auf AWT, Swing, JavaFX & SWT 3
lumo SWT Exception in thread "main" org.eclipse.swt.SWTError: No more handles AWT, Swing, JavaFX & SWT 3
Luk10 Swing Problem mit Zeichen-Thread AWT, Swing, JavaFX & SWT 8
G 2D-Grafik Von Thread aus Zeichnen AWT, Swing, JavaFX & SWT 5
U Swing JLabel bewegen mittels Thread AWT, Swing, JavaFX & SWT 3
M JProgressBar für einen Thread AWT, Swing, JavaFX & SWT 14
R JTable und Thread AWT, Swing, JavaFX & SWT 4
K Thread.sleep in GUI AWT, Swing, JavaFX & SWT 4
J Thread funktioniert nicht AWT, Swing, JavaFX & SWT 10
D JPanel mit Thread in JPanel AWT, Swing, JavaFX & SWT 4
F Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: null AWT, Swing, JavaFX & SWT 5
P Teil einer Swing GUI in eigenem Thread AWT, Swing, JavaFX & SWT 4
S Thread.sleep() in einer methode fürs zeichen AWT, Swing, JavaFX & SWT 3
O JTree/TreeModel/DefaultMutableTreeNodes thread safe machen AWT, Swing, JavaFX & SWT 3
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
F SWT table refresh per Thread AWT, Swing, JavaFX & SWT 2
V Swing remove(Component) blockiert Thread sehr lange. AWT, Swing, JavaFX & SWT 6
J AWT Artefakte bei AWT-Rendering durch parallelen Thread AWT, Swing, JavaFX & SWT 4
H Thread-Problem mit der Darstellung beim Sperren des Fensters AWT, Swing, JavaFX & SWT 2
T Event Dispatch Thread und noch ein Thread AWT, Swing, JavaFX & SWT 7
Burny91 Swing Thread mit wait() und notify() steuern AWT, Swing, JavaFX & SWT 22
N SWT - über Thread Composite erstellen und Anhängen AWT, Swing, JavaFX & SWT 6
K Vom Gui aus auf einen Thread warten AWT, Swing, JavaFX & SWT 4
X Problem bei JTextArea und Thread.sleep() AWT, Swing, JavaFX & SWT 8
F Merkwürdiges Verhalten zeichnen sperater Thread AWT, Swing, JavaFX & SWT 13
B Swing Swing und Thread.sleep() AWT, Swing, JavaFX & SWT 6
N Exception Behandlung mit setDefaultUncaughtExceptionHandler, insbesondere im EventDispatcher Thread AWT, Swing, JavaFX & SWT 4
Q Neuer Thread zum Öffnen AWT, Swing, JavaFX & SWT 2
P Swing GUI im Thread? AWT, Swing, JavaFX & SWT 5
T GUI JFrame - neuer Thread AWT, Swing, JavaFX & SWT 2
data89 Was mache ich mit "Dispatched Event Thread"/Substance falsch? AWT, Swing, JavaFX & SWT 4
0x7F800000 Allg. Frage zum ev. dispatch thread, wie korrekt auf reaktion der Listener warten? AWT, Swing, JavaFX & SWT 4
S Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 7
T thread.sleep Sprung Problem AWT, Swing, JavaFX & SWT 24
N Server mit Thread und Statusbox AWT, Swing, JavaFX & SWT 3
S Objektverhalten in einen Thread legen AWT, Swing, JavaFX & SWT 4
G JProgressBar actionPerformedMethode und SwingUI thread AWT, Swing, JavaFX & SWT 36
E Komponenten in Event Dispatch Thread erzeugen? AWT, Swing, JavaFX & SWT 4
J Thread in GUI einbauen AWT, Swing, JavaFX & SWT 2
Lony AbstractTableModel Exception in thread "AWT-EventQueue- AWT, Swing, JavaFX & SWT 3
A Ticker als Thread AWT, Swing, JavaFX & SWT 3
G Auf Ergebnis vom Thread warten AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben