# Threading in Android



## Wimme (31. Okt 2012)

Hi ihr!

Ich mache gerade meine ersten Schritte in der Android Entwicklung. Leider tritt in im Verhalten meines Apps jetzt etwas unerwartetes auf, so dass ich einmal hier nachfragen möchte.

Im Prinzip habe ich 2 Buttons "start" und "stop" und TextView. Wenn der "start" Button gedrückt wird, soll ein Thread gestartet werden, der seine Arbeit verrichtet und auch ab und an das TextView setzen muss. Wenn der "stop" button gedrückt wird, soll der Thread beendet werden.

Da man die GUI ja nur im UIThread verändern darf, habe ich das ganze jetzt so aufgebaut:

```
public class MainActivity extends Activity {
Acitivity ich = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ich = this;
    }
....
 /* Called when the user clicks the start button */
    public void start(View view){
                       ....
        		DerThread t = new DerThread(p1, p2, .., ich);
        		new Thread(t).start();
        		output.setText("started!");   	//output ist das TextView, auf das vorher natürlich zugegriffen wurde
    	}
```

sowie:

```
public class DerThread implements Runnable {
	private .. p1;
	private .. p2;
        ...
	private Activity m;
	
	DerThread(.. p1,.. p2, ..., Activity ma){
                ...
		m= ma;
	}
	
	
	public void run (){
		m.runOnUiThread(new UIThread());
	}
	
	
	
	private class UIThread implements Runnable {
		
		public void run (){
			TextView output = (TextView) m.findViewById(R.id.text_out);
			output.setText("test");
		}
	}
	
}
```


Fragen:
1. Wieso wird "started" von Zeile 16 erster Code nicht ausgegeben?
2. Wenn ich jetzt eine Funktion für "stop" erstelle, wie beeinde ich dann am besten "DerThread"?

Ich hoffe ihr könnt mir helfen 
Wimme


----------



## SlaterB (31. Okt 2012)

1.
kommt die Ausgabe, wenn du Zeile 14+15, also den Thread wegläßt?
wenn auch nicht dann ist das ein allgemeines Problem, da kann man zunächst wenig sagen,
was ist output, wie funktionier die GUI dort usw.

weiterhin:
ist das output in Zeile 23 + 24 im zweiten Code-Block mit dem output im ersten verknüpft?

"output ist das TextView, auf das vorher natürlich zugegriffen wurde"
klingt so komisch, da sonst nirgendwo weiter von einer TextView die Rede ist

wenn dort "test" geschrieben wird, kann das "started!" nach kurzer Zeit überschreiben?

------

2.
der beste Weg ist immer, einen Thread auslaufen zu lassen,
da du keine Schleife in den run-Methoden hast sollte das eh schon der Fall sein,
wenn run zu Ende, dann Thread aus,
sonst evtl. boolean setzen mit dem Schleifen abgebrochen werden


----------



## Wimme (31. Okt 2012)

1. Ja, wenn ich Zeile 14+15 weglasse, klappt die Ausgabe.
Und nochmals ja, das output Field ist in beiden Codeteilen dasselbe.



> wenn dort "test" geschrieben wird, kann das "started!" nach kurzer Zeit überschreiben?


Bin ich mir nicht sicher,was du damit meinst. Wenn ich nichts tue, steht dort einfach nur "test". Wenn ich "start" nochmals drücke, dann sehe ich kurz das "started", was aber sofort wieder von "test" überschrieben wird.

___

2. Eben, wenn run() fertig ist, sollte der Thread doch auch fertig sein. Deswegen verstehe ich nicht, warum "test" stehen bleibt...


----------



## SlaterB (31. Okt 2012)

also Thread, Runnable, runOnUiThread() usw. steht normalerweise für Nebenläufigkeit,
es ist teils nicht klar, was wann drankommt,

du startest den Thread, bzw. fügst ihn per runOnUiThread() irgendwo in eine Liste,
dann kann aber bzw. wird hier evtl. zwingend zunächst noch der Aufrufer, die start()-Methode zu Ende bearbeitet, 
"started!" kommt dran,

erst danach kann womöglich der UiThread anderes manchen, sonst vielleicht vom Zufall abhängig,
jedenfalls danach später "test", ergo "test" dauerhaft zu sehen,

wozu überhaupt der Thread? jedenfalls wird nicht 
> output.setText("test");
bis zu dessen Ende verzögert, schreibe das doch als letzten Befehl in die run-Methode des Threads


----------



## Wimme (31. Okt 2012)

stimmt, ist ja eigentlich klar...



> wozu überhaupt der Thread? jedenfalls wird nicht
> > output.setText("test");
> bis zu dessen Ende verzögert, schreibe das doch als letzten Befehl in die run-Methode des Threads



Du meinst in die run Methode des "DerThread" Threads? Das dürfte nicht gehen, weil ich die GUI nur über den UIThread verändern darf.


----------



## SlaterB (31. Okt 2012)

wo auch immer, da ist output ja auch gar nicht vorhanden, die Klasse DerThread eh fragwürdig wenn sie allein UIThread laufen läßt,

meinetwegen in dessen run-Methode, wobei 

```
TextView output = (TextView) m.findViewById(R.id.text_out);
output.setText("test");
output.setText("started!");
```
im Moment nicht sehr intelligent wirkt, der Zweck von allem ist unklar


vielleicht am Ende von run von DerThread, falls zwischendurch noch mehr passiert,
nochmal mit runOnUiThread() eine Nachricht setzen


----------



## Wimme (31. Okt 2012)

Naja, in "DerThread" passiert ja durchaus noch mehr, das Beispiel ist ja stark vereinfacht


----------

