Java: eingeschüchtert von folgendem Konstrukt :-(

Gast #4376407
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
}
#4376418
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
Gast #4376422
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.
Gast #4376694
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() {}
}
Gast #4376703
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.
Gast #4377022
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.
Gast #4379221
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren