# AsyncTask und doInBackground Frage



## Schlucki6666 (14. Nov 2014)

Hallo Gemeinde;
Ich hoffe, dass ich euch hier nun mit meiner letzten Frage "quälen" darf. Ich stehe gerade vor einem für mich unlösbaren Rätzel. Im Netz habe ich dazu einiges gefunden, aber (sorry) ich kappier es einfach nicht! Es geht dabei um AsyncTask und doInBackground.
Mein Vorhaben wäre aus einem EditText den Inhalt (zB. "11") als String mittels getMethode "auszulesen" und diesen String an eine URL anzufügen. Was als Resultat dann ungefähr so aussehen sollte:

```
URL url = new URL("http://schlucki.......ch/"+ STRING + ".txt");
```

Da, soweit ich das verstehe, AsyncTask und darin doInBackground, wie der Name es schon sagt im Background läuft/arbeitet, kann ich auf das EditText oder TextView nicht wie normal mit "findViewById" zugreifen. 

Kann mir das eventuell kurz einer erklären oder sagen wie das funktioniert oder wie ich es anstellen kann, dass ich den Inhalt des EditTextes in meine URL in der doInBackground Methode einfügen kann?

Sorry, wenn es mal wieder eine absolute Banalität ist, aber .......... ich bin echt gerade ....... ihr wisst schon !!!

Mein Programmcode (Schnippsel) wo ich hänge wäre:


```
class myTask extends AsyncTask<Void, Void, Void>{


	@Override
	protected Void doInBackground(Void... params) {		
try {
      URL url = new URL("http://schlucki........ch/"+ datei);
```

Danke, für eure Hilfe
Schlucki


----------



## anti-held (14. Nov 2014)

Diese ganzen Voids kannst du durch andere Objekte wie z.B. String ersetzen.
So kannst du beim starten deines AsyncTasks den String (deine "11") übergeben.

Vill solltest du dir Generics genauer ansehen:
Generics


----------



## dzim (14. Nov 2014)

*AsyncTask<X, Y, Z>*

*X = Klasse der Eingabeparameter*

```
@Override
protected Z doInBackground(X... params) {
//...
return <object-typ-Z>; // wenn Z=Void, dann null
}
```

*Y = Klasse der Zwischenergebnisse*
(kann mit *publishProgress(<objeckt-typ-Y>);* von innerhalb von *#doInBackground* aufgerufen werden)

```
@Override
protected void onProgressUpdate(Y... params) {...}
```

*Z = Klasse des Ergebnisses*

```
// siehe oben: Z doInBackground(X... params)
// oder auch
@Override
protected Z onPostExecute(Z result) {...}
```

Steht aber letzten Endes alles in der Doku und ist einfach herauszufinden, indem man mal was anderes als Void nutzt.
Entscheidend ist, das AsyncTask intern den Messaging-Mechanismus verwendet um Nachrichten über die Thread-Grenzen hinweg zu verteilen. Eigentlich ist das Teil - finde ich - nach aussen ziemlich einfach gestrickt:

- *UI-THREAD:* im Konstruktor oder #onPreExecute holt man sich, wenn man es braucht, die UI-Elemente oder bereitet generell alles vor
- *NICHT UI-THREAD:* im #doInBackground passiert die "Magic" - aber eben nicht auf dem UI-Thread!
- mittels #publishProgress kann man noch in #doInBackground z.B. updates der UI auslösen, wobei der eigentliche Update dann in #onProgressUpdate passiert (*UI-THREAD*!!!)
- *UI-THREAD:* in #onPostExecute kann man dann die abschliessenden UI-Updates machen (wenn man z.B. im ersten Schritt einen Fortschirttsdialog geöffnet hat, kann man ihn hier automatisiert schliessen, oder das Ergebniss anzeigen) und auch die Resourcen aufräumen (ich lösch' hier immer gerne alle Referencen auf die UI...)


----------

