Moin zusammen,
mal wieder eine typische Anfängerfrage: Wie kann ich wirklich abfragen, ob der Async Task schon fertig ist?
En detail:
Ich möchte gerne Informationen aus einer Datenbank einer globalen Liste hinzufügen. Dazu benutze ich eine Klasse Download, welche die Klasse AsyncTask erweitert (siehe Snippet 1). Nachdem dieser Download und das Hinzufügen des Ergebnis an die globale Liste erfolgt ist, soll nun dieser Scanner geschlossen werden und die globale Liste in der ListActivity angezeigt werden (siehe Snippet 2). Mein Problem dabei ist nun, dass der Scanner sich manchmal vor dem Empfang des Ergebniss beendet und die ListActivity aufruft. Dazu wird dann folgende Fehlermeldung ausgeben:
Anschließend beendet sich APP.
Folgendes habe ich schon erfolglos versucht:
Ich hoffe, ihr könnt mir einen Tipp geben. Sollten noch Angaben fehlen, kann ich diese selbstverständlich nachreichen. Ich habe den Code hier nur gekürzt wiedergegeben, damit der Fokus auf dieses Problem gerichtet wird.
Viele Grüße aus dem Ruhrgebiet
Tobias
Snippet 1:
[CODE lang="java" title="Download.java"]
public class Download extends AsyncTask<Void, Integer, String> {
...
// receiveData beeihaltet an der Stelle 0 den Status und an der Stelle 2 das Ergebnis der Abfrage als JSON
// Im Fehlerfall muss ein leerer String zurückgegeben werden
@Override
protected String doInBackground(Void... voids) {
try{
List<String> tmp = this.receiveData.getResponse();
if(tmp.get(0).equals("200")){ // Emfang der Daten ist korrekt
return tmp.get(2);
}else{
return "";
}
}catch(Exception e){
return "";
}
}
//Überprüfung, wann der Async Task fertig ist
@Override
protected void onPostExecute(String s) {
//Notwendig, da JSONArray ein String im JSON Format benötigt
try {
//Es wird das erste Ergebnis der SQL selktiert.
JSONObject jsonObject = new JSONArray(s).getJSONObject(0);
//Hinzufügen des Elements entsprechend der Definition der Klasse Tools
TOOL_LIST.add(new Tools(
jsonObject.getString("Bezeichnung"),
this.barcode,
SELECTED_USER.getpNumber(),
new Date()
));
// Ausführen des Garbage Collector
System.gc();
// Bestätigung, dass das Hinzufügen erfolgreich ist
System.out.println("ADDING: " + s);
}catch(Exception e){
//Ausgabe etwaiger Fehler (zB String ist nicht in JSON Notation)
System.out.println("Failed: " + e.getMessage());
}
finally {
semaphore = false;
}
}
}
[/CODE]
Snippet 2:
[CODE lang="java" title="ScannerActivity"]public class ScannerActivity extends AppCompatActivity {
...
private void getNextView() throws Exception {
//Der Downloader wird initalisiert
DownloadTools downloadTools = new DownloadTools();
//Der Hintergrundprozess führt den Download duch und speichert das Ergebnis in die Variable res
String res= downloadTools.execute().get();
//Das Ergebniss des Downloads wird aufgerufen
System.out.println("Tool adding is finished: " + res);
//Die nächste Acitivity wird aufgerufen
openNextPage();
}
@Override
public void onBackPressed(){
Intent intent = new Intent(this, MainActivity.class);
this.finish();
startActivity(intent);
}
private void openNextPage(){
Intent intent = new Intent(this, ListActivity.class);
this.finish();
startActivity(intent);
}
}[/CODE]
mal wieder eine typische Anfängerfrage: Wie kann ich wirklich abfragen, ob der Async Task schon fertig ist?
En detail:
Ich möchte gerne Informationen aus einer Datenbank einer globalen Liste hinzufügen. Dazu benutze ich eine Klasse Download, welche die Klasse AsyncTask erweitert (siehe Snippet 1). Nachdem dieser Download und das Hinzufügen des Ergebnis an die globale Liste erfolgt ist, soll nun dieser Scanner geschlossen werden und die globale Liste in der ListActivity angezeigt werden (siehe Snippet 2). Mein Problem dabei ist nun, dass der Scanner sich manchmal vor dem Empfang des Ergebniss beendet und die ListActivity aufruft. Dazu wird dann folgende Fehlermeldung ausgeben:
W/System: A resource failed to call end.
Anschließend beendet sich APP.
Folgendes habe ich schon erfolglos versucht:
- die Methode getNextView() entsprechend im Downloader auszuführen
- eine globale Variable semaphore (boolean) zu verwenden
Ich hoffe, ihr könnt mir einen Tipp geben. Sollten noch Angaben fehlen, kann ich diese selbstverständlich nachreichen. Ich habe den Code hier nur gekürzt wiedergegeben, damit der Fokus auf dieses Problem gerichtet wird.
Viele Grüße aus dem Ruhrgebiet
Tobias
Snippet 1:
[CODE lang="java" title="Download.java"]
public class Download extends AsyncTask<Void, Integer, String> {
...
// receiveData beeihaltet an der Stelle 0 den Status und an der Stelle 2 das Ergebnis der Abfrage als JSON
// Im Fehlerfall muss ein leerer String zurückgegeben werden
@Override
protected String doInBackground(Void... voids) {
try{
List<String> tmp = this.receiveData.getResponse();
if(tmp.get(0).equals("200")){ // Emfang der Daten ist korrekt
return tmp.get(2);
}else{
return "";
}
}catch(Exception e){
return "";
}
}
//Überprüfung, wann der Async Task fertig ist
@Override
protected void onPostExecute(String s) {
//Notwendig, da JSONArray ein String im JSON Format benötigt
try {
//Es wird das erste Ergebnis der SQL selktiert.
JSONObject jsonObject = new JSONArray(s).getJSONObject(0);
//Hinzufügen des Elements entsprechend der Definition der Klasse Tools
TOOL_LIST.add(new Tools(
jsonObject.getString("Bezeichnung"),
this.barcode,
SELECTED_USER.getpNumber(),
new Date()
));
// Ausführen des Garbage Collector
System.gc();
// Bestätigung, dass das Hinzufügen erfolgreich ist
System.out.println("ADDING: " + s);
}catch(Exception e){
//Ausgabe etwaiger Fehler (zB String ist nicht in JSON Notation)
System.out.println("Failed: " + e.getMessage());
}
finally {
semaphore = false;
}
}
}
[/CODE]
Snippet 2:
[CODE lang="java" title="ScannerActivity"]public class ScannerActivity extends AppCompatActivity {
...
private void getNextView() throws Exception {
//Der Downloader wird initalisiert
DownloadTools downloadTools = new DownloadTools();
//Der Hintergrundprozess führt den Download duch und speichert das Ergebnis in die Variable res
String res= downloadTools.execute().get();
//Das Ergebniss des Downloads wird aufgerufen
System.out.println("Tool adding is finished: " + res);
//Die nächste Acitivity wird aufgerufen
openNextPage();
}
@Override
public void onBackPressed(){
Intent intent = new Intent(this, MainActivity.class);
this.finish();
startActivity(intent);
}
private void openNextPage(){
Intent intent = new Intent(this, ListActivity.class);
this.finish();
startActivity(intent);
}
}[/CODE]