Probleme mit AsyncTask

  • Antworten:7
  • Bentwortet
Erik Sattelmair
  • Forum-Beiträge: 10

09.02.2012, 18:03:05 via Website

Hallo liebe Androide-Gemeinde.

Ich habe ein Problem mit dem Thema AsyncTask. Ich habe eine Klasse, die von AsyncTask abgeleitet ist und nichts anderes macht, als einen Progressdialog anzuzeigen. In der doInBackground-Methode rufe ich dann führe ich dann eine Ecectue-Befehl einer anderen, von AsyncTask abgeleiteten Klasse, welche einen Webserveraufruf startet und mir Daten als String zurückliefert. Vor diesem Befehl setze ich den aktuellen Thread auf wait(). Sollte es einen Fehler geben (keine Internetverbindung), starte ich in der aufrufenden Klasse die get()-Methode und setze sie auf 7 Sekunden. Danach ruft der aufgerufene Thread die notify()-Methode auf und es geht weiter.

Problem: Es scheint, als ob der aufgerufene Thread gar nicht erst startet. Woran kann das liegen?? Hier mein Code:

Aufrufende Klasse:
protected synchronized ProgressDialog doInBackground(String... params) {

getConnection = new GetConnection(ergebnis, info);
getConnection.execute(params);
try {
wait();
getConnection.get(7,TimeUnit.SECONDS);
getConnection.notify();
} catch (InterruptedException e1) {
new AlertDialog.Builder(ergebnis).setMessage(R.string.connection_failed_dialog).setNeutralButton(R.string.error_button, null).show();
} catch (ExecutionException e) {
new AlertDialog.Builder(ergebnis).setMessage(R.string.connection_failed_dialog).setNeutralButton(R.string.error_button, null).show();
} catch (TimeoutException e) {
new AlertDialog.Builder(ergebnis).setMessage(R.string.connection_failed_dialog).setNeutralButton(R.string.error_button, null).show();
}

Aufgerufene Klasse:

public class GetConnection extends AsyncTask<String, Integer, String>{

private ErgebnisDialogActivity ergebnisDialog;
private TarifInformation info;
// private ProgressDialog progress;

private String results;
private HttpClient httpClient;
private HttpGet httpGet;
private HttpResponse response;


// -------------- Aufbau der Connection zum Server, welcher in der URL refferenziert wird ----------------
// -------------- Connection wird im Hintergrund aufgebaut (doInBackground()) ----------------

public GetConnection(ErgebnisDialogActivity ergebnisDialog, TarifInformation info){
this.ergebnisDialog = ergebnisDialog;
this.info = info;
}

// @Override
// protected void onPreExecute(){
// progress = new ProgressDialog(ergebnisDialog,ProgressDialog.STYLE_SPINNER);
// progress.setMessage("Bitte warten...");
// progress.show();
// }

@Override
protected String doInBackground(String... params) {
httpClient = new DefaultHttpClient();
httpGet = new HttpGet(params[0]);
try {
response = httpClient.execute(httpGet);
InputStream in = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder sb = new StringBuilder();
String line;
while((line = reader.readLine()) != null){
sb = sb.append(line).append("\n");
}
in.close();
results = sb.toString();
return results;
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

return "ERROR";
}

@Override
protected void onPostExecute(String res){

Intent intent = new Intent(ergebnisDialog,ErgebnisDialogActivity.class);
intent.putExtra("geschlecht", info.getGeschlecht());
intent.putExtra("gebDat", info.getGebDat());
intent.putExtra("beruf", info.getBeruf());
intent.putExtra("versBeginn", info.getVersBeginn());
intent.putExtra("tarifAuswahl", info.getTarifAuswahl());
intent.putExtra("status", ergebnisDialog.getStatus());
intent.putExtra("progress", ergebnisDialog.getProgress());
intent.putExtra("resString", res);
ergebnisDialog.startActivity(intent);
}

Danke schon mal für alle Hinweise.

MfG

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

09.02.2012, 19:09:11 via Website

Für was brauchst du in diesem Fall 2 AsyncTasks? Ich sehe den Sinn darin gerade nicht. Warum machst du nicht alles in einem AsyncTask? Würde die ganze Geschichte vermutlich vereinfachen.

Antworten
Erik Sattelmair
  • Forum-Beiträge: 10

09.02.2012, 19:16:31 via Website

Hallo Florian B., das Problem besteht darin, das der eine Thread bei fehlender Internetverbindung endlos läuft und ich dann das Problem habe, das auch der Progressdialog endlos läuft. Das will ich aber nicht. Der Progressdialog soll dann beendet werden.

MfG

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

09.02.2012, 19:25:12 via Website

Warum sollte der eine Thread bei fehlender Internetverbindung endlos laufen? Dafür gibt es doch Timeouts. Die dafür sorgen, dass nicht ewig auf eine Verbindung gewartet wird. Wenn dieser Zeitraum überschritten wird, dann wird eine Exception geworfen und die doInBackground() Methode läuft weiter bis zum Ende. Die Länge des Timeouts kannst du für den DefaultHttpClient einstellen.

Antworten
Erik Sattelmair
  • Forum-Beiträge: 10

09.02.2012, 19:31:38 via Website

Das mit den Timeouts hab ich auch schon probiert. Und zwar habe ich in der die GetConnection-Klasse direkt von meiner Activity aus aufgerufen und dann mit .get() Methode den Timeout definiert. Dann allerdings wird der Progressdialog nicht mehr angezeigt.

Allerdings weiß ich nicht, wie man den Timeout für den Default-HTTP-Client einstellt.

Hast du mir evtl. n Stück Code zum erklären??

MfG

Antworten
Erik Sattelmair
  • Forum-Beiträge: 10

09.02.2012, 20:14:17 via Website

Du bist der Größte :)

Das war genau das was ich gesucht habe. Tausend Dank und einen schönen Abend noch.

MfG

Antworten
Erik Sattelmair
  • Forum-Beiträge: 10

09.02.2012, 20:37:01 via Website

Aber nur Interesse halber: Wie ist es (wenn überhaupt) möglich, aus einer doInBackground()-Methode nen anderen Thread zu starten??

MfG

Antworten