Threads Android AysncTask => Überprüfen, ob ein Ergebniss schon vorliegt

Naxon89

Mitglied
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:

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:
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;
        }
    }
}

Snippet 2:
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);       
    }
}
 

Jw456

Top Contributor
Hallo

Beim Asynctast ist es so das die "doInBackground" Methode in einenm Thread ausgeführt wird. Wenn der beendet ist wird automatisch die "onPostExecute" Methode aufgerufen. Also die Methode wird immer am ende des Threads aufgerufen und die Methode wird im UI Thread ausgeführt.
Wenn du also willst das dein "openNextPage()" am Ende des Threads ausgeführt wird gehört das dort hin.
Nicht in der Main nach dem Aufruf des Task.

Das was du in der Activity nach den execute aufrufst wird unabhängig was der Task macht sofort ausgeführt. Es wird nicht auf den Thread gewartet.
Die Variable res und das get macht bei AsyncTask keinen sinn.
Dafür hast du die onPostExecute Methode.


Was in deinen Code nicht stimmen kann ist. In der Activity rufst du das auf
DownloadTools downloadTools = new DownloadTools();

Dein Asynctask heißt aber
„Download“ also das ist nicht der gleiche Task den du in der Activity startest.




Bemerken möchte ich auch das AsyncTask ab API 30 deprecated ist.
 
Zuletzt bearbeitet:

Naxon89

Mitglied
Vielen Dank für deine Antwort

Beim Asynctast ist es so das die "doInBackground" Methode in einenm Thread ausgeführt wird. Wenn der beendet ist wird automatisch die "onPostExecute" Methode aufgerufen. Also die Methode wird immer am ende des Threads aufgerufen und die Methode wird im UI Thread ausgeführt.
Wenn du also willst das dein "openNextPage()" am Ende des Threads ausgeführt wird gehört das dort hin.
Nicht in der Main nach dem Aufruf des Task.
Das ist mir durchaus bewusst und war auch mein erster Ansatz. Leider hat dies das Problem auch nicht gelöst.

Dein Asynctask heißt aber
„Download“ also das ist nicht der gleiche Task den du in der Activity startest.
Das sind nur Ausschnitte aus meinem Source Code, da ich noch mehrere Methoden habe. Die Methode, die AsyncTask erweitert, heißt DownloadTools

Bemerken möchte ich auch das AsyncTask ab API 30 deprecated ist.
Soll ich statt AsyncTask besser auf Callable wechseln? Quelle: stack overflow
 

mihe7

Top Contributor
Wie kann ich wirklich abfragen, ob der Async Task schon fertig ist?
UI-Programmierung ist im Grundsatz immer ereignisorientiert und man sollte tunlichst jeden Versuch unterlassen, von diesem Paradigma abzuweichen - gerade unter Android.

globale Variable semaphore
Globaler, veränderlicher Zustand ist praktisch immer Mist - gerade unter Android.

Android hat den netten Effekt, dass es praktisch jede Activity zu jeder Zeit "killen" kann, das gleiche gilt für die ganze Application. Wenn man das nicht bedenkt, sorgt man regelmäßig für Überraschungen (=Abstürze). Dafür hat das System aber auch ganz klar definierte Lebenszyklen.

Zur Warnung "W/System: A resource failed to call end.": da sagt mir meine Glaskugel, dass Du einen Stream der HTTP-Connection nicht geschlossen hast.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Bene247 Android App (Trinkspiel) Java Basics - Anfänger-Themen 1
N Android Studio notwendig oder sinnvoll? Java Basics - Anfänger-Themen 7
S Gibt es irgendeine Möglichkeit, dies zu tun?(Android Studio) Java Basics - Anfänger-Themen 1
I Java Anwendung auf Android portieren Java Basics - Anfänger-Themen 1
S Android Service ferngesteuert starten Java Basics - Anfänger-Themen 5
A Alternativen zu Android Studio ??? Java Basics - Anfänger-Themen 14
L Android Activity Java Basics - Anfänger-Themen 10
A Wie gebe ich bei android eine string im programm aus? Java Basics - Anfänger-Themen 4
F JAVA oder Android Studios Java Basics - Anfänger-Themen 3
J Datentypen Komm in einem Android Buch mit Java nicht weiter... Java Basics - Anfänger-Themen 7
L Problem mit Android ListView Java Basics - Anfänger-Themen 2
W Pfeiltasten im Android Studio Java Basics - Anfänger-Themen 1
A Erste Schritte Zu Android exportieren Java Basics - Anfänger-Themen 6
M Spracherkennung in Android Java Basics - Anfänger-Themen 3
S Wie entwickelt man eine Library die auf dem JRE und Android laeuft..? Java Basics - Anfänger-Themen 0
A Android-Lib: Sourcecode Generator mittels Annotation Processing Java Basics - Anfänger-Themen 0
A Random String in TextView (Android)? Java Basics - Anfänger-Themen 2
T Android Display in 4 teilen... Java Basics - Anfänger-Themen 3
T Android opengl will net.. Java Basics - Anfänger-Themen 3
T Android App: Laden dauert lange Java Basics - Anfänger-Themen 1
T IllegalStateExeption Android App Java Basics - Anfänger-Themen 19
M Variablen Zähler funktioniert nicht - Android App Java Basics - Anfänger-Themen 3
A Suche Programmierer für Android App Java Basics - Anfänger-Themen 1
K Android vs Java+libgdx Java Basics - Anfänger-Themen 1
K Android 2d engine mit fortlaufendem hintergrund Java Basics - Anfänger-Themen 1
G Android App Java Basics - Anfänger-Themen 3
kaoZ Input/Output Typprüfung (Android ) Java Basics - Anfänger-Themen 1
kaoZ Input/Output Android : Deserialisieren von mehreren Objekten in einer Datei Java Basics - Anfänger-Themen 0
K Erste Schritte Android Recources (MyFirstApp) Java Basics - Anfänger-Themen 4
B Variablen Android: Spinner-Eintrag einen versteckten numerischen Wert zuordnen und Variable übergeben Java Basics - Anfänger-Themen 3
kaoZ Alternative zu ToggleButton (Android/Java) Java Basics - Anfänger-Themen 12
kaoZ Android Programmierung / Erstellen einer neuen Instanz Java Basics - Anfänger-Themen 2
C Android APP - Load More Button und beschleunigung... Java Basics - Anfänger-Themen 2
M javamail android app Java Basics - Anfänger-Themen 3
M Wie lernt man Android Java Basics - Anfänger-Themen 22
J Android R.Java verändern!? Java Basics - Anfänger-Themen 6
J Android app Satzteile Java Basics - Anfänger-Themen 3
S Android fuer Swing-Kenner..? Java Basics - Anfänger-Themen 6
A Android Datenbank gaaanz einfaches Insert geht nicht - warum? Java Basics - Anfänger-Themen 4
A BufferedImage in Android einbinden - Bild spiegeln -wie? Java Basics - Anfänger-Themen 4
eLogic Android - Fehler "stopped unexpectedly" Java Basics - Anfänger-Themen 7
E Android: OnClickListener erkennt Buttons nicht Java Basics - Anfänger-Themen 7
E Buttons in Android generieren? Java Basics - Anfänger-Themen 4
E Welcher Package Name bei Eclipse/Android? Java Basics - Anfänger-Themen 2
H Überprüfen ob String Array leer ist Java Basics - Anfänger-Themen 4
C Überprüfen eines Programms auf Syntaxfehler Java Basics - Anfänger-Themen 3
CptK Überprüfen ob übergebenes Objekt zu Generics passt Java Basics - Anfänger-Themen 2
G Überprüfen ob alle Ziffern von 1-9 in einem Integer vorhanden sind Java Basics - Anfänger-Themen 6
A Überprüfen, ober eine Zahl Ziffer enthält Java Basics - Anfänger-Themen 12
C Überprüfen eines Queltextes auf Syntax-Fehler und Laufzeitfehler Java Basics - Anfänger-Themen 2
K Überprüfen ob Eingabe ein Float ist Java Basics - Anfänger-Themen 4
P Überprüfen ob Mausklick auf Linie ist? Java Basics - Anfänger-Themen 6
J Überprüfen, ob eine 2D Matrix ein Baum ist Java Basics - Anfänger-Themen 5
J Methoden Überprüfen ob Objekt bereits erstellt wurde Java Basics - Anfänger-Themen 2
J Überprüfen ob String eine Zahl ist Java Basics - Anfänger-Themen 2
T Überprüfen, ob Objekt gelöscht wurde Java Basics - Anfänger-Themen 1
G String Elemente auf Zahlen Überprüfen Java Basics - Anfänger-Themen 21
O Überprüfen ob eine Methode ausgeführt wurde Java Basics - Anfänger-Themen 10
C Überprüfen auf Palindrom Java Basics - Anfänger-Themen 12
B Überprüfen von Strings schlägt fehl Java Basics - Anfänger-Themen 5
S Arbeiten mit einer CSV Datei und Überprüfen von einem Datum in einem Textfeldern Java Basics - Anfänger-Themen 4
C Überprüfen, ob Timer läuft Java Basics - Anfänger-Themen 3
C Problem mit Überprüfen einer Eingabe Java Basics - Anfänger-Themen 5
S Überprüfen auf Permutation Java Basics - Anfänger-Themen 4
K Überprüfen ob Datei vorhanden Java Basics - Anfänger-Themen 2
G Überprüfen ob einen Array einen Value enthält Java Basics - Anfänger-Themen 13
P Überprüfen, ob String Zeichenfolge enthält Java Basics - Anfänger-Themen 4
T Überprüfen, ob Array Elemente hat Java Basics - Anfänger-Themen 22
I Überprüfen eines Passwortes Java Basics - Anfänger-Themen 5
J Überprüfen ob Leerzeile im String[][] array Java Basics - Anfänger-Themen 2
N Überprüfen ob ein Label angeklickt wurde Java Basics - Anfänger-Themen 3
P Methode zum Überprüfen ob Datei verwendet wird? Java Basics - Anfänger-Themen 3
G Überprüfen wann ein Dokument abläuft? Java Basics - Anfänger-Themen 3
C Überprüfen, ob die eingabe auch buchstaben enthält Java Basics - Anfänger-Themen 6
G Überprüfen ob es ein Link existiert Java Basics - Anfänger-Themen 3
S Überprüfen, ob Tabelle existiert Java Basics - Anfänger-Themen 5
M Überprüfen ob die eingaben in einem JTextField eine Zahl ist Java Basics - Anfänger-Themen 5
H Überprüfen ob Request mit enctype=multipart/form-data Java Basics - Anfänger-Themen 2

Ähnliche Java Themen


Oben