Swing SwingWorker - richtige Implementierung doInBackground()

sp2017

Mitglied
Ich habe eine Frage zum SwingWorker. Nachdem was ich gelesen habe, sollte doInBackground() time consuming tasks ausführen. Allerdings ist mir jetzt nicht klar, was in meinem Fall in die doInBackground() Methode gehört, die calculateNoFeedBack() Methode oder liege ich da komplett falsch und habe das ganze falsch verstanden? Den SwingWorker wollte ich implementieren, da die named entity extraction (APIs sind für Named Entity Extraction) einige Zeit dauert und ich gerne eine %-Angabe hätte oder einfach einen Text ausgeben wollte (Entities werden extrahiert oder so)

In meinem Programm rufe ich nachdem ein Button geklickt wurde folgende Methode auf:
Code:
tModel.calculateNoFeedback(tView.getLanguage(), tView.getAPI(), tView.getCorr();

calculateNoFeedback() Methode sieht so aus:
Code:
public void calculateNoFeedback(String language, List<String> api, List<String> corr)  {



        Map<String, Object> apis = startAPI(api, textList);

    }

und startAPI() Methode ruft dann die entsprechenden vom User gewählten APIs auf:


Code:
public Map<String, Object> startAPI(List<String> selectedAPI, List<String> text) throws InvocationTargetException, IOException, InterruptedException, URISyntaxException, GateException {

        API apiExtract;

       

        Map<String, Object> microsoftValues;

        Map<String, Object> gateValues;

        Map<String, Object> googleValues;

        Map<String, Object> alchemyValues;

       

        Map<String, Object> apisValues = new HashMap<String, Object>();

       

        for(String a : selectedAPI) {

            switch (a) {

            case "alchemy" : 

                System.out.println(" API alchemy");

                 

                break;

               

            case "google": 

                System.out.println(" API google");

                break;

               

            case "gate": 

                System.out.println(" API gate"); 

                apiExtract = new GateAPI();

                gateValues = apiExtract.getEntities(text);

                apisValues.put("valuesGate", gateValues);

                //System.out.println("gate values: "+apiValues);

                break;

               

            case "microsoft": 

                System.out.println(" API microsoft");

                apiExtract = new MicrosoftAPI();

                microsoftValues = apiExtract.getEntities(text);

                apisValues.put("valuesMS", microsoftValues);

                //System.out.println("ms values: " + apiValues);

                break;

               

            }

        }

        return apisValues;

    }

Danke.
 
Wird denn die calculateNoFeedback Methode in einer schleife aufgerufen oder was?

Wenn du nur eine Methode ausführst dann bringt ein Swingworker ja nichts solange du nicht irgendwas das im Hintergrund passiert einen Statustext ändern kann. Würde das calculaeNoFeedback also nur einmal aufgerufen kannst du ja auch vorher deinen "Bitte Warten" Text ausgeben oder nicht?

Bekommst du während calculateNoFeedback rennt denn irgendwelche Rückmeldungen wie weit die Methode ist oder irgendwas das du während die Methode rennt updaten oder ausgeben könntest?

Gruß

Claus
 
Meiner Meinung nach gehört entweder ein Callback in die startAPI rein oder du machst das ganze in der doInBackground. Da kennst du ja den Fortschritt und den verbleibenden Arbeitsaufwand.
 
Es ist so, das von der calculateNoFeedback() zuerst die APIs aufgerufen werden (die jeweils gewählten vom User hier stehen 4 zur Auswahl und es kann eine oder alle 4 gewählt werden) und von den Ergebnissen, die ich von den APIs erhalte, wird danach eine Methode aufgerufen die die Korrelation berechnet. Eventuell habe ich das mit dem SwingWorker auch falsch verstanden. Ich wollte eben wenn API1 aufgerufen wird einen Statustext ausgeben (API1 extracts entities.....) dann bei API2 (API2 extracts entities....). Also ich wollte das GUI updaten während die Methoden laufen, und da dachte ich das ich einen SwingWorker brauche, weil ohne den wird mir nichts ausgegeben bzw. erst nachdem alle APIs und die Berechnung fertig ist
 

Zurück
Oben