Allgemeine Frage zur Syntax (Java) AsynchUtil.runAsynchronously(new Runnable() {})....

  • Antworten:2
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 41

06.10.2016 17:19:04 via Website

Hallo,

ich habe kein praktisches Problem, ich muss nur für einen technischen Bericht die Thread-Erzeugung erklären.

Mit dem nachfolgendenen Beispielcode wird ein Thread gestartet:

public void Get() {
 // Capture property values in local variables before running
  // asynchronously.
 final CapturedProperties webProps = capturePropertyValues("Get");



    AsynchUtil.runAsynchronously(new Runnable() {
       @Override
       public void run() {
         try {
           performRequest(webProps, null, null);
         } catch (FileUtil.FileException e) {
           form.dispatchErrorOccurredEvent(Web.this, "Get",
               e.getErrorMessageNumber());
         } catch (Exception e) {
           form.dispatchErrorOccurredEvent(Web.this, "Get",
               ErrorMessages.ERROR_WEB_UNABLE_TO_GET, webProps.urlString);
         }
       }
     });
    }

Meine Frage nun: Wie ist denn genau die folgende Zeile Java-syntax-mäßig (fachlich möglichst präzise und korrekt ;-) ) zu erklären:

    AsynchUtil.runAsynchronously(new Runnable() {...})

Also AsynchUtil ist eine Klasse aus dem Paket java.lang (richtig formuliert?)
Mit dieser Zeile wird die statische Methode (da das Objekt AsynchUtil nicht erzeugt wurde, kann diese Methode ja nur aufgerufen werden, wenn sie statsich ist. richtig?) runAsynchronously aufgerufen. Diese Methode erhält als Paramter das frisch erzeugte Objekt (new) Runnable ohne Parameter ( () ). Soweit richtig? Und die geschweiften Klammern dahinter mit einem Programmcode drin... wie ist das java-mäßig genau zu erklären/rechtfertigen? Offensichtlich gehört das alles zum Übergabeparamter von runAsynchronously. Aber ich dachte immer, man kann nur Variablen (Datenfelder oder Objekte) als Parameter an eine Methode übergeben... und nicht ganze Programmcodes und schon garkeine geschweiften Klammern !?

Ich bedanke mich schonmal.

Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.311

06.10.2016 19:18:13 via Website

Hallo Arne,
was benutzt du für Libs?
Etwa google AppInventor?
Denn ich kenne vom StandardJava kein AsynchUtil...
Wenn man das googelt stößt man auf die API DOC:
http://3nportal.com/AIBridge/API/com/google/appinventor/components/runtime/util/AsynchUtil.html
Ist wohl aus dem Package com.google.appinventor.components.runtime.util
Aber das gehört garantiert nicht zum Java Lang Package. Du musst da irgenwelche externen Libs für nutzen.

Zudem schau dir mal den Code der AsynchUtil.runAsynchronously(Runnable r); an:
https://github.com/mit-cml/appinventor-sources/blob/master/appinventor/components/src/com/google/appinventor/components/runtime/util/AsynchUtil.java
Das ist nur eine Vereinfachungsmethode für einen neuen Thread und dessen Start. Das kann man mit den beiden Zeilen auch selber machen, zudem hat man da dann noch das ThreadObjekt in der Hand mit dem man noch arbeiten könnte. Zb. abfagen ob der Thread noch läuft etc..

Aber zurück:
Der Methode übergibst du ein Parameter, ein Objekt der Klasse Runnable. Die Klasse Runnable instanziierst du mit leerem Konstruktor (keine Parameter) und schreibst in die geschweifen Klammern eine run-Methode mit der Annotation @Overrride was soviel bedeutet wie überschreibe die Methode run() der Klasse Runnable in diesem Objekt mit meinem folgenden Code.
In deinem Beispiel oben ist beides einfach verschachtelt, d.h. du initialisiertst dein Runnable.Objekt direkt in der Parameterügergabe der runAsync Methode. Das muss man nciht so machen, du könntest auch erst eine Runnable erzeigen und die Variable danach übergeben. (Ist an manchen stellen übersichtlicher, gerade wenn der Code in der Run Methoe etwas länger ist.

Noch was? :P

— geändert am 06.10.2016 19:19:35

LG Pascal //It's not a bug, it's a feature. :) ;)

  • Forum-Beiträge: 41

08.10.2016 10:39:29 via Website

Danke Pascal :)

Ja, ist von AppInventor. Das ist aber eigentlich egal, als neugieriger Mensch wollte ich nur wissen was die geschweiften Klammern bei den Übergabeparameter zu suchen haben. Hast du gut erklärt, Stichwort ist glaube ich auch "anonyme, innere Klasse", wie ich inzwischen herausgefunden habe ;-)