Verständnisfrage Asynctask

  • Antworten:4
Juergen
  • Forum-Beiträge: 3

30.07.2013, 23:50:56 via Website

Hallo

Ich möchte mir eine App erstellen in der ich einen TCP/IP Client integriere.

Da ich ja die Netzwerksache nicht im Main Thread machen kann habe ich mir die Sache mit Asynctask angeschaut.

Leider habe ich da große Probleme zu verstehen wie die ganze Sache gehandelt wird.

Frage1:

Was passiert wenn ich in der Methode doInBackground(...) eine Klasse instanziere
z.B. ipcon = new IPConnection();

Wenn kein weiterer Code in doInBackground steht springt er ja direkt in onPostExecute(...) richtig?

Was aber passiert nun mit dieser Instanz "ipcon" ? Läuft die im Main Thread, oder läuft die in einem neuen Thread oder ist sie ganz weg weil der AsyncTask bereits abgeschlossen wurde?
Kann ich auf die Methoden dieser Instanz noch zugreifen?

Frage2:

Ich schreibe in doInBackground(...) folgendes
z.B.

clientSocket = new Socket("192.168.1.1", 2002);
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));

Es werden ja dann auch nur die Socketverbindung und die 2 Buffer erstellt. Anschließend wird gleich in onPostExecute(...) richtig?

Was passiert dann mit der Verbindung? Läuft die in einem anderen Thread, oder ist sie weg weil der AsyncTask bereits abgearbeitet wurde?
Kann ich noch auf die Buffer zugreifen?

Ich weiß die Fragen sind total blöd, aber ich finde irgendwie keine Erklärung/Antwort weil es wohl zu trivial ist.

Danke schon mal

Gruß Jürgen

— geändert am 31.07.2013, 11:00:59

Antworten
Andreas Hoffmann
  • Forum-Beiträge: 36

31.07.2013, 07:27:58 via App

doInBackground(...) wird von einem anderen Thread ausgeführt. Wenn du da Objekte erzeugst, kannst du diese in allen Threads deiner App Nutzen, musst aber auf die Synchronisation achten.

Alle Netzwerk Interaktionen sollten in extra Threads ausgelagert werden. Vielleicht ist es hier einfacher einen eigenen Thread zu schreiben.

Des Weiteren ist beim Verwenden von Sockets und Strömen auf Exception Handling zu achten!

— geändert am 31.07.2013, 07:28:23

Antworten
Juergen
  • Forum-Beiträge: 3

31.07.2013, 09:42:00 via Website

Aber was passiert wenn doinbackground durchgelaufen ist? Ist der Thread dann nicht auch wieder beendet?

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

31.07.2013, 11:06:14 via Website

Threading / Synchroinisierung ist kein so leichtes Thema. Da kann man ne menge falsch machen und dennoch läuft es "meistens".

Ich rate dir wenn du kannst lieber einen Loader oder einen AsyncTaskLoader zu verwenden, die sich ansich einfacher zu benutzen.
Natürlich kannst du von Thread A und B was aus C benutzen. Wenn du Synchronisierst werden auch alle Threads das korrekte ergebnis sehen.

Ein AsyncTask ist nicht weiter als ein aufgebohrer ThreadPool und einer davon arbeitet den Job ab. Die Threads darin werden nicht beendet, da ein Thread zu erzeugen recht teuer ist macht man sowas ansich auch nicht irgendwo im Code. Ein runnable eine Executer oder Pool zuzuweisen ist deutlich besser und erhöht die wiederverwendbarkeit.

Dir fehlen ein paar Grundlagen, daher würde ich das ganze mal in Plain Java schreiben da der Android Aspekt das ganze nicht einfacher macht.

Was konkret AsyncTask angeht, das ist doch seitens der Doc und anderen Blogs mehr als hinreichend erklärt.

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

Antworten
Juergen
  • Forum-Beiträge: 3

04.08.2013, 11:17:48 via Website

Ja, das mit dem Threading ist für mich im Moment echt schwere Kost.
Ich habe bisher fast nur Mikrocontroller programmiert, und da nur alles sequentiell programmiert.

Aber dennoch möchte ich nochmal auf meine Ausgangsfrage zurückkommen.

Ich würde sehr gerne wissen was genau mit einer in einem Asynctask erstellten Socketverbindung oder Instanz einer Klasse passiert nachdem der Asynctask durchgelaufen ist.

Wird das vom Garbage Collector dann einfach aufgeräumt, oder kann ich das noch nutzen?

Ich habe jetzt die ganze Woche danach gesucht aber eine Erklärung hab ich niergends gefunden.

Wäre also sehr dankbar für eine Antwort oder einen Link.

Danke

— geändert am 04.08.2013, 11:18:34

Antworten