Forum: PC-Programmierung Java: eingeschüchtert von folgendem Konstrukt :-(


von Laspalmas (Gast)


Lesenswert?

Hallo Leute,

Bin gerade dabei Java für android zu lernen. Leider so ein Konstrukt 
(siehe weite unten) bringt mich zu verzweifeln  :-(  !!!

- OnClick wird definiert.
- es wird eine Referenz von typ Thread erzteugt
- der Konstruktor nimmt als parameter ein Runnable Referenz. was heisst 
aber
  new Runnable(){....}. Runnable erzeugen und gleichzeitig definieren?!!
- was ist dann mit run!!! überschreibt die run von Runnable??!


vielen Dank für Euere Hilfe.
1
public void onClick(View v) {
2
    new Thread(new Runnable() {
3
        public void run() {
4
            Bitmap b = loadImageFromNetwork("http://example.com/image.png");
5
            mImageView.setImageBitmap(b);
6
        }
7
    }).start();
8
}

: Bearbeitet durch Moderator
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ich kann zwar kein Java :), aber das "new Runnable" legt eine
neue Instanz von Runnable an, wobei in den geschweiften Klammern
danach der Konstruktor für diese Instanz folgt, der wiederum eine
Methode run() beschreibt.

Man hätte das sicher auch mit Zwischenvariablen etwas übersichtlicher
schreiben können.

von Roland P. (pram)


Lesenswert?

Ja die run() wird überschrieben, bzw. hier implementiert, weil Runnable 
ein Interface ist.
Dieses Konstrukt heißt "anonyme Klasse"

Gruß Roland

von Andreas B. (andreasb)


Lesenswert?

Lassen wir das Runnable mal aussen vor, und weisen den Thread einer 
lokalen Variable zu:
1
public void onClick(View v) {
2
   Thread t = new Thread(XXX);
3
   t.start();
4
}
Soweit klar mit dem Thread? Das andere ist nur kürzer...

Das mit dem Runnable ist eine Anonyme Klasse, also eine Klasse, ohne 
Name.
1
public class MeinRunnable implements Runnable {
2
        public void run() {
3
            Bitmap b = loadImageFromNetwork("http://example.com/image.png");
4
            mImageView.setImageBitmap(b);
5
        }
6
    }
7
}

Für das XXX oben müsste natürlich nun
1
new MeinRunnable()
stehen.

Wie du siehst: Geht auch in kurz, und mit wesentlich weniger Code...


mfg Andreas

: Bearbeitet durch User
von greg (Gast)


Lesenswert?

Laspalmas schrieb:
> - der Konstruktor nimmt als parameter ein Runnable Referenz. was heisst
> aber
>   new Runnable(){....}. Runnable erzeugen und gleichzeitig definieren?!!

Ja, so ungefähr. Das Feature nennt sich "anonymous class". Nimm das mal 
als Suchbegriff.

> - was ist dann mit run!!! überschreibt die run von Runnable??!

Genau.

Das ist eigentlich kein ungewöhnliches Konstrukt. So etwas ausführlich 
ohne anonymous classes hinzuschreiben ist recht unübersichtlich.

von Laspalmas (Gast)


Lesenswert?

jetzt ist es verständlicher.
Vielen Dank an alle.

von Roland P. (pram)


Lesenswert?

In Java 8 wurden Lambda - Ausdrücke eingeführt. Damit gehts noch etwas 
übersichtlicher.

von Noch einer (Gast)


Lesenswert?

Verdammt! Kaum wird es etwas verständlicher, kommt mit Java8 wieder was 
anderes.

Und die Lisp-Programmierer werden nie verstehen, warum man für 
Lambda-Ausdrücke Final-Variablen braucht.

P.S. Die alte Schreibweise muss man trotzdem noch lernen:

new Callback() {
  public void run() {}
  public void onError() {}
}

von Mladen G. (Gast)


Lesenswert?

Roland P. schrieb:
> In Java 8 wurden Lambda - Ausdrücke eingeführt. Damit gehts noch etwas
> übersichtlicher.

Android unterstuetzt noch kein Java 8.

Laspalmas schrieb:
> es wird eine Referenz von typ Thread erzteugt

Da wird gar keine "Referenz" erzeugt, sondern eine nur eine Instanz und 
diese gleich als Parameter uebergeben.

Java nutzt andere Begriffe als C++, als erstes sollte man sich damit 
auseinandersetzen.

von Noch einer (Gast)


Lesenswert?

Und außerdem hast du noch richtig Glück gehabt!

Für das mImageView macht der Compiler einige Verrenkungen mit this. 
Manchmal muss man das richtige this im Programmcode auswählen.

Und es gibt auch Beispiele, in denen die Methode der anonymen Klasse auf 
den Parameter v zugreift.

Das erste Beispiel, bei dem du über diese Konstruktion stolpert, hätte 
auch 3 mal so komplex sein können.

von apr (Gast)


Lesenswert?

Was ich persönlich als wirklich schwierig zu verstehen finde: Es gibt in 
diesem Konstrukt ja keinen -Pointer- – pardon: keine Referenz – auf die 
Instanz von Thread. Was hindert den GC direkt nach verlassen der 
Funktion das Thread-Objekt zu löschen?

von Gregor O. (zappes)


Lesenswert?

Der Umstand, dass Thread-Objekte von der VM direkt referenziert werden.

von apr (Gast)


Lesenswert?

Gregor O. schrieb:
> Der Umstand, dass Thread-Objekte von der VM direkt referenziert
> werden.

Danke dir!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.