Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Generalizzare metodo da lanciare in background

    ciao!

    ho questo spezzone di codice da lanciare in diversi punto del programma:
    codice:
    public class BackgroundTask { 
     
        public void execTask() throws InterruptedException { 
     
            LoadingDialog loadingDialog = new LoadingDialog(); 
            Task<Void> task = new Task<Void>() { 
                @Override 
                public Void call() throws InterruptedException { 
                    // DO STUFF
                    return null; 
                } 
            }; 
            loadingDialog.activateProgressBar(task); 
            task.setOnSucceeded(event -> { 
                loadingDialog.getDialogStage().close(); 
            }); 
            task.setOnCancelled(event -> { 
                loadingDialog.getDialogStage().close(); 
            }); 
            loadingDialog.getDialogStage().show(); 
            Thread thread = new Thread(task); 
            thread.start(); 
        } 
     
    }
    in sostanza l'unica cosa che cambia è la riga commentata, che è dove eseguo l'operazione in background, che può essere uno scaricamento di un file dal web, opppure un invio di dati in post ad un servizio remoto.
    per evitare di usare tutto quel codice ovunque nel programma (in circa una decina di punti), ho pensato di generalizzarlo e poi passare in qualche modo solo l'operazione da eseguire.
    è possibile secondo voi??

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da fermat Visualizza il messaggio
    per evitare di usare tutto quel codice ovunque nel programma (in circa una decina di punti), ho pensato di generalizzarlo e poi passare in qualche modo solo l'operazione da eseguire.
    è possibile secondo voi??
    Sì, certo. Una soluzione: passare il Task<Void> task al execTask(). Ma non è l'unica soluzione!

    Tra l'altro c'è una questione: BackgroundTask non ha "stato" (non vedo sue variabili di istanza, almeno per quanto postato). Quindi una istanza di BackgroundTask a chi/cosa serve?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    ciao andbin!
    Sì, certo. Una soluzione: passare il Task<Void> task al execTask(). Ma non è l'unica soluzione!
    intendi una cosa del genere:
    codice:
    public class BackgroundTask { 
     
        public void execTask(Task<Void> task) throws InterruptedException { 
            LoadingDialog loadingDialog = new LoadingDialog(); 
            loadingDialog.activateProgressBar(task); 
            task.setOnSucceeded(event -> { 
                loadingDialog.getDialogStage().close(); 
            }); 
            task.setOnCancelled(event -> { 
                loadingDialog.getDialogStage().close(); 
            }); 
            loadingDialog.getDialogStage().show(); 
            Thread thread = new Thread(task); 
            thread.start(); 
        } 
     
    }
    per poi fare:
    codice:
        private void updateBooks() { 
            try { 
                BackgroundTask bt = new BackgroundTask(); 
                Task<Void> task = new Task<Void>() { 
                    @Override 
                    public Void call() throws InterruptedException { 
                        try { 
                            jsb.launchService("all_books"); 
                            jsb.launchService("all_authors"); 
                            jsb.launchService("all_editors"); 
                            jsb.launchService("graph_authors"); 
                            jsb.launchService("graph_editors"); 
                            jsb.download(UrlAndPath.JSON_LIBRI); 
                            jsb.download(UrlAndPath.JSON_AUTORI); 
                            jsb.download(UrlAndPath.JSON_EDITORI); 
                            setTable(); 
                        } catch (IOException e) { 
                            GenericDialog.showDialog(e.getMessage(), Alert.AlertType.ERROR); 
                        } 
                        return null; 
                    } 
                }; 
                bt.execTask(task); 
            } catch (InterruptedException e) { 
            } 
        }
    ??

    Tra l'altro c'è una questione: BackgroundTask non ha "stato" (non vedo sue variabili di istanza, almeno per quanto postato). Quindi una istanza di BackgroundTask a chi/cosa serve?
    uhm penso di non aver capito bene che intendi!

  4. #4
    cmq ho fatto qualche prova:
    codice:
        private void updateBooks() { 
            try { 
                BackgroundTask bt = new BackgroundTask(); 
                Task<Void> task = new Task<Void>() { 
                    @Override 
                    public Void call() throws InterruptedException { 
                        try { 
                            jsb.launchService("all_books"); 
                            jsb.launchService("all_authors"); 
                            jsb.launchService("all_editors"); 
                            jsb.launchService("graph_authors"); 
                            jsb.launchService("graph_editors"); 
                            jsb.download(UrlAndPath.JSON_LIBRI); 
                            jsb.download(UrlAndPath.JSON_AUTORI); 
                            jsb.download(UrlAndPath.JSON_EDITORI); 
                            //setTable(); 
                        } catch (IOException e) { 
                            GenericDialog.showDialog(e.getMessage(), Alert.AlertType.ERROR); 
                        } 
                        return null; 
                    } 
                }; 
                bt.execTask(task); 
            } catch (InterruptedException e) { 
            } 
        }
    funziona tutto tranne la riga commentata, che si occupa di fare il refresh della TableView.
    se non commentata ottengo questo errore:
    codice:
    Exception in thread "Thread-4" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da fermat Visualizza il messaggio
    funziona tutto tranne la riga commentata, che si occupa di fare il refresh della TableView.
    se non commentata ottengo questo errore:
    codice:
    Exception in thread "Thread-4" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4
    JavaFX usa lo stesso paradigma e la medesima filosofia che c'è anche in Swing. Esiste un singolo thread specifico che si occupa del disegno della interfaccia utente e degli eventi. L'accesso ai componenti, layout ecc.. va fatto SOLO nel contesto di questo thread specifico. Non nel contesto di un altro "tuo" thread.

    Swing non fa controlli in tal senso, JavaFX invece è più pignolo, li fa e causa appunto un IllegalStateException.

    Semplicemente devi fare "passare" un pezzetto di codice nel JavaFX application thread usando il Platform.runLater
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  6. #6
    giusto, mi ero dimenticato (e lo avevo anche usato da qualche altra parte ).

    codice:
        private void updateBooks() { 
            try { 
                BackgroundTask bt = new BackgroundTask(); 
                Task<Void> task = new Task<Void>() { 
                    @Override 
                    public Void call() throws InterruptedException { 
                        try { 
                            jsb.launchService("all_books"); 
                            jsb.launchService("all_authors"); 
                            jsb.launchService("all_editors"); 
                            jsb.launchService("graph_authors"); 
                            jsb.launchService("graph_editors"); 
                            jsb.download(UrlAndPath.JSON_LIBRI); 
                            jsb.download(UrlAndPath.JSON_AUTORI); 
                            jsb.download(UrlAndPath.JSON_EDITORI); 
                            Platform.runLater(new Runnable() { 
                                @Override 
                                public void run() { 
                                    setTable(); 
                                } 
                            }); 
                        } catch (IOException e) { 
                            GenericDialog.showDialog(e.getMessage(), Alert.AlertType.ERROR); 
                        } 
                        return null; 
                    } 
                }; 
                bt.execTask(task); 
            } catch (InterruptedException e) { 
            } 
        }
    così non ho errori e viene tutto eseguito.

    grazie!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.