Threads/Handler

  • Antworten:8
Daniel
  • Forum-Beiträge: 99

05.03.2014, 22:26:25 via Website

Moin Androiden,
ich habe viele Sachen zu Threads/Handler gelesen, leider auch vieles auf Englisch, was manchma schwer wird als Deutscher :P
Aber richtig gute Erklärungen habe ich nicht gefunden.
Was genau bewirkt ein Thread? Was genau ist dazu ein Handler?
Was hat Runnable mit denen zu tun? Sind die immer gebunden da?
Ich blicke da nicht ganz durch. Ich will nämlich was Periodisches einbauen und muss dieses Verständnis haben, weil ich ja nur Handler z.B. auf UI zugreifen können. Im Laufe der Zeit poste ich in diesen Thread noch Sources^^

Für Antworten bin ich dankbar.

MfG,
Daniel^^

Antworten
Daniel
  • Forum-Beiträge: 99

06.03.2014, 00:02:21 via Website

Den Link habe ich gelesen und nichts über Runnable gelesen, der Zusammenhang zwischen Handler und Thread ist mir auch nicht klar :/
Ich hab zudem gelesen, dass Timer periodische Ausführungen nicht gut bei Android sein und man mehr auf Handler umsteigen soll.

Antworten
Andreas S.
  • Forum-Beiträge: 76

06.03.2014, 00:51:49 via Website

Ein Thread oder ein Handler benötigt zum Ausführen deines Codes irgendeinen Einstiegspunkt.
Und das wird mit dem Interface Runnable erreicht, da es immer gleich definiert ist, mit der einzigen Methode run().

Schau dir mal das Thema Interfaces an:

Link: addison-wesley.de/service/krueger/kap07007.htm

Ein Runnable ist nichts anderes als ein Interface:

1public interface Runnable{
2
3 void run();
4
5}

Dadurch wird gewährleistet, dass Handler und Thread immer einen Einstiegspunkt zum Ausführen des Codes haben.

Antworten
Fabian Simon
  • Forum-Beiträge: 359

06.03.2014, 08:23:40 via Website

Hallo,
das mit dem Runable ist kein Muss !


Ein Thread fuehrt Code parallel zu deinem Aktuellen Code aus.
Du kannst auch einen "wirklichen" Thread verwendet.
Das sieht dann in etwa so aus :

1public class MeinThread extends Thread{
2
3public void run(){
4super.run();
5//mach was in einem anderen Thread
6}
7
8}

Damit kannst du was paralell ausführen....
Aufrufen kannst du das mit :

1public class MeineAndereKlasse{
2 private MeinThread thread;
3 public void openMeinThread(){
4 if (thread == null){
5 thread = new MeinThread();
6}
7thread.start();
8}
9
10
11
12
13}


Ein Handler ist imgrunde ein Interface...

Wenn z.B in unserm Thread beispiel oben der haupprozess informiert werden soll wenn der Thread das Arbeiten beendet hat kannst du das so machen :
1public interface MeinThreadHandler{
2public void meinThreadisFinish();
3...
4}

Der Oben stehende Code ändert sich auf folgendes:

1public class MeinThread extends Thread{
2private MeinThreadHandler handler= null;
3
4public MeinThread(MeinThreadHandler handler){
5this.handler = handler;
6}
7
8public void run(){
9super.run();
10//mach was in einem anderen Thread
11handler.meinThreadisFinish();
12}
13
14}

Damit kannst du was paralell ausführen....
Aufrufen kannst du das mit :

1public class MeineAndereKlasse implements MeinThreadHandler {
2 private MeinThread thread;
3 public void openMeinThread(){
4 if (thread == null){
5 thread = new MeinThread(this);
6}
7thread.start();
8}
9public void meinThreadisFinish(){
10System.out.println("Finish");
11}
12
13}


So in etwa haben den Code jetzt aber nicht getestet sonder direkt hier reingeschrieben.
Das hat übrigens nicht mit Android zu tun sondern ist ein Standart in z.B.: Java.
Somit kannst du weitere infos auch unter "java ist nur eine Insel" herrausfinden.
Als Tipp:
Versteife dich nicht auf Android.
Sondern auch immer schauen was du für Java findest...

Gruß
Fabian

— geändert am 06.03.2014, 12:46:50

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

06.03.2014, 11:28:28 via Website

Anzumerken sei, das es eher schlecht ist Vererbung zu benutzen, also direkt von der Thread Klasse. Die Klasse Thread bietet entsprechende Methoden ein Runnable zu übergeben. Das hat den Vorteil das man z.b später recht einfach einen ThreadPool benutzen kann und dann sehr flexibel mehrere Dinge ausführen kann. So wäre es denkbar das ein Mobile Device mit 4 Kernen 4 Threads im Pool hat andere wiederum nur 2.#


Ein Handler ist dafür da um von Thread A nach Thread B daten zu senden. Grundsätzlich ist es so das wenn du Daten zwischen Threads austauscht es passieren kann das der Empfänger Thread diese nicht 'sieht'. Das Thema ist sehr komplex, und Android hat deshalb das konzept der Handler um z.b von einem Thread der gerade ein Bild runterlädt die Oberfläche zu benachrichtigen. Das UI darf nur vom UI Thread aus angesprochen werden da es sonst wieder zu Problemen der 'sichtbarkeit' führt. Im Code ist das nicht direkt ersichtlich aber jeder Thread hat eine kopie aller variablen die er benutzt in seinem eigenden Speicherbereich mit dennen er arbeitet

Thread A -> [variable a,b,c,d,e]
Thread B -> [variable a,b,c,d,e]

Diese sind von einander getrennt, ändert nun Thread A variable b heisst das nicht das Thread B diese Änderung sieht.
Java und damit auch android hat z.b das konzept der Synchronisierung mit dem Wort 'synchronized' welches den Thread der in eine Methode oder allgemeinen einen Block von Code betritt dazu zwingt sich 'frische' werte für die Variablen zu besorgen. weiterhin gibt es noch das Schlüsselwort volatile
welches für einzelne variablen genutzt werden kann, aber hier muss man aufpassen !! da nicht alle Operationen 'atomar' sind. Allein dazu gibt es Bücher und würde hier zu weit führen.


Zurück zu deiner Eigendlichen Frage:

Thread A nutzt Handler X von Thread B um ihm Daten zu senden.

Der Handler wird auf dem Thread B erzeugt und an A übergeben und man hat kein Problem mit der Sichtbarkeit. Ansich ein schönes konzept da es unter Android Transparent ist und man lediglich drauf achten sollte das der Handler im richtigen Thread erzeugt wird.



hth,
Mac

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Fabian Simon
  • Forum-Beiträge: 359

06.03.2014, 11:47:05 via Website

Es sollte noch erwähnt werden das die behandlung eines Threads sich von Programmiersprache zu Programmiersprache unterscheidet.
So kann man in Java z.B.: Daten realtiv direkt austauschen.
Hingegen in .net sprachen kein Direkter austausch möglich ist.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

06.03.2014, 11:51:26 via Website

Fabian Simon

Hingegen in .net sprachen kein Direkter austausch möglich ist.
Was meinst ud damit?
In .net kann man doch auch daten zurückmelden oder eine Callback methode einfügen.

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

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

06.03.2014, 12:34:01 via Website

Das ist schön, aber wir sind im Android Forum ^^ Wo letzendlich alles unter der Davlik/ART VM läuft, ausser man geht nativ.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten