Wie verwende ich AsyncTask ?

  • Antworten:4
  • Bentwortet
ECR
  • Forum-Beiträge: 72

31.07.2012, 17:43:01 via Website

Ich habe mal ne grundsätzliche Frage über die AsyncTask. Wie oft sollte ich solche AsyncTask verwenden? Eher oft oder möglichst wenig?
Diese AsyncKlasse
1AsyncTask<Void, Void, ArrayList<String>>
welche ja auch 3 Methoden mitbringt muss ich ja für jeden AsyncTask implementieren. Wenn ich also viele AsyncTask verwende, dann habe ich genau auch soviele Klassen? Ist das sinnvoll? Wie Handle ich all diese Klassen? Bis jetzt habe ich diese immer als inneren Klassen in die MainActivity reingeschrieben. Aber so wird das ja immer länger die MainAcitivity Klasse?

Oder sollte ich möglichst wenig Asynctask's verwenden?

Um konkret ein Beispiel zu nennen. Ich habe eine Jason Datei von einer Mysql DB, diese sollte ausgwertete werden und in einzelne Objekte umgewandelt werden. Danach wird eine sqlite DB erstellt und diese Objekte werden in die sqliteDB abgefüllt.
Wie würdet ihr das machen? 1Task,2Task oder alles in der MainActivity?

Antworten
ECR
  • Forum-Beiträge: 72

02.08.2012, 14:26:21 via Website

Ok, ich habe mal den ganzen Thread plus die Links durchgelesen. Ziemlich viel Informationen. Konnte nicht mit allem etwas anfangen da ich erst begonnen habe mit Andorid.

Wenn ich das also richtig verstehe wird aus Performance Gründe und vom Programmieraufwand her eine Innere Klasse benutzt. Ich fand aber keinen Hinweis darauf ob man denn nun viele Aufgaben in AsyncTask verschieben sollte oder nicht? Denn all diese AsyncTask werden von meiner MainActivity gestartet, daher gibt es in dieser Klasse ziemlich viele Innere Klassen was ja dann ziemlich unübersichtlich wird?

Was ich auch nicht ganz verstanden habe sind die 3 Parameter welche übergeben werden:

1extends AsyncTask<Uri, Void, Void>
Der 1 Parameter ist der welcher an den AsyncTask übergeben wird
Der 2 Paramter dient als ProgessBar updater??
Der 3 Parameter ist der Parameter welcher von doInBackground zurückgegeben wird und an onPostExecute übergeben wird.

Stimmt das so?

Antworten
ECR
  • Forum-Beiträge: 72

02.08.2012, 16:59:10 via Website

Ich hätte gleich noch ne Frage denn es bezieht sich auf das Verständniss der AsyncTask.

Das ist die Aync Innere Klasse,während dieser Zeit wollte ich einfach den Porgessbar mit dem Kreis anzeigen lassen. Denn das herunterladen muss man nur das erste mal machen wenn man die App startet. Nachher ist der Stundenplan ja immer auf der DB.

Ich habe eine ArrayList mit lauter StunendplanObjekten. Jedes Objekt steht für einen Termin, so kann ich das nun in die Sqlite DB schreiben. Wie erhalte ich nun die ArrayList aus dieser inneren Klasse? Damit ich in der MainActivity die Sqlite Klasse füllen kann? Oder soll ich im AsynTask bleiben und gleich die DB füllen?

1private class DownloadServerData extends AsyncTask<Void, Void, ArrayList<Stundenplan>> {
2
3
4 ProgressDialog prog;
5
6 protected void onPreExecute() {
7
8 prog = new ProgressDialog(activity);
9 // prog.setTitle("Titel");
10 prog.setMessage("Downloading data...");
11 prog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
12 prog.show();
13 }
14
15 @Override
16 protected ArrayList<Stundenplan> doInBackground(Void... params) {
17
18 //Eine ArrayList welche Objekte von Stundeplan haltet
19 ArrayList<Stundenplan> stundenplanList = new ArrayList<Stundenplan>();
20 //Holt sich das JSON Object
21 JSONArray dataJSON = new ConnectionDB().getData();
22
23 //Durchläuft jedem Eintrag im JSON Object und speichert diesen in der StundenplanArray
24 for (int i = 0; i < dataJSON.length(); i++) {
25
26 JSONObject objectJSON = null;
27 try {
28 objectJSON = dataJSON.getJSONObject(i);
29
30
31 Stundenplan stundenplanObject = new Stundenplan();
32
33 stundenplanObject.setStart(objectJSON.getLong("start"));
34 stundenplanObject.setEnde(objectJSON.getLong("ende"));
35 stundenplanObject.setAnzahlLektionen(objectJSON.getInt("anzahlLektionen"));
36 stundenplanObject.setKlasse(objectJSON.getString("klasse"));
37 stundenplanObject.setZimmerNr(objectJSON.getInt("zimmerName"));
38 stundenplanObject.setBezeichnungFach(objectJSON.getString("bezeichnung"));
39 stundenplanList.add(stundenplanObject);
40 } catch (JSONException e) {
41 // TODO Auto-generated catch block
42 Log.e("log_tag", "Error converting result " + e.toString());
43 }
44
45 }
46
47 return stundenplanList;
48 }
49
50 protected void onPostExecute(ArrayList<Stundenplan> items) {
51
52
53
54
55// //Hier noch ein isFinishing einbauen
56
57 }
58 }

Antworten
Florian B.
  • Forum-Beiträge: 284

02.08.2012, 20:18:20 via Website

Eliseo R.
Was ich auch nicht ganz verstanden habe sind die 3 Parameter welche übergeben werden:

1extends AsyncTask<Uri, Void, Void>
Der 1 Parameter ist der welcher an den AsyncTask übergeben wird
Der 2 Paramter dient als ProgessBar updater??
Der 3 Parameter ist der Parameter welcher von doInBackground zurückgegeben wird und an onPostExecute übergeben wird.

Stimmt das so?

Genau genommen sind es die Typen der Parameter.


Eliseo R.

Ich habe eine ArrayList mit lauter StunendplanObjekten. Jedes Objekt steht für einen Termin, so kann ich das nun in die Sqlite DB schreiben. Wie erhalte ich nun die ArrayList aus dieser inneren Klasse? Damit ich in der MainActivity die Sqlite Klasse füllen kann? Oder soll ich im AsynTask bleiben und gleich die DB füllen?

Ja, das solltest du auch gleich im AsyncTask erledigen. Alle Operationen, die nicht direkt mit der UI zu tun haben, sollten in einem eigenen Thread stattfinden. Dazu gehören eben auch Netzwerk- und Datenbankzugriffe.

Antworten