2017-08-01 2 views
1

Ich habe ein Programm erstellt, das über PHP eine Verbindung zu einer Datenbank herstellt und eine Antwort zurückgibt. Mein Android-Programm macht dann eine Anforderung an die PHP-Datei und liest das Echo in.Java-Code wird nicht ausgeführt, nachdem eine Klassenfunktion aufgerufen wurde

public class Read_Author extends AsyncTask<String, Void, String> { 

    String authorName = ""; 


    @Override 
    public String doInBackground(String... params) { 

    try { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("http://localhost/scripts/read_information.php"); 
     HttpResponse response = httpclient.execute(httppost); 
     authorName = String.valueOf(EntityUtils.toString(response.getEntity())); 

     String myStr = "ANSWER"; 
     Log.v(myStr, authorName); 
    } 
    catch(Exception e){ 

    } 

    return authorName; 

} 

public String returnAuthor(){ 

    return authorName; 
} 

}

ich erfolgreich das Echo-String abrufen und in den Variablen des Namen des Autors Zeichenfolge setzen. Aber wenn ich dann versuche, den Autor von meiner Hauptaktivität zurückzurufen, bekomme ich keinen Fehler, aber der Code wird nicht ausgeführt.

Ich nenne eine Funktion namens "readValue" innerhalb meiner Hauptaktivität und innerhalb dieser Funktion wird die Funktion execute gelesen und dann soll die returnauthor Funktion ausgeführt werden. Aber anstatt, passiert nichts Main Activity-Code:

public void returnAuthor(){ 
    loadAuthor.execute(); 

    String a = loadAuthor.returnAuthor(); 
    Log.v("HIT ME", a); 
    } 

Wenn jemand einen Vorschlag hat, warum das passiert sein könnte und wie man es beheben, die sehr geschätzt werden!

+1

Ausführung Sie haben eine AsyncTask, Sie brauchen keine returnAuthor zu rufen, sondern warten, bis die Tast erfolgt und Gibt das String-Ergebnis zurück –

+0

welche Art von Listener kann ich dafür innerhalb der Klasse verwenden? – RW6

Antwort

1

Sie scheinen Missverständnis über AsyncTask zu haben. Das Ergebnis AsyncTask ist möglicherweise nicht sofort verfügbar, da die Hintergrundaufgabe möglicherweise nicht abgeschlossen wurde.

Sie müssen die Methode onPostExecute in Ihrem AsyncTask überschreiben, um eine Aufgabe auszuführen, nachdem die Hintergrundaufgabe abgeschlossen wurde.

Zuerst zeigen eine progressDialog vor dem AsyncTask

final ProgressDialog progressDialog = new ProgressDialog(this); 
progressDialog.setMessage("Loading.."); 
progressDialog.setCancelable(false); 
progressDialog.show(); 

Dann in der onPostExecute:

@Override 
protected void onPostExecute(String result) { 
    progressDialog.dismiss(); 
    Log.d("author", result); 
} 
+0

in Ordnung, sobald ich die onPostExecute-Funktion hinzugefügt und die Hintergrundaufgabe abgeschlossen ist, wird die onPostExecute ausgeführt und dann sollte ich die Zeichenfolge zurückgeben? Und wenn das der Fall ist, was wird mein Hauptaktivitätscode tun, während die Asynctask im Hintergrund ausgeführt wird? Gibt es eine Möglichkeit, die Hauptaktivität warten zu lassen, bis die ausführbare Hintergrunddatei fertig ist? – RW6

+0

Sie möchten Ihre App möglicherweise nicht einfrieren, indem Sie auf die Beendigung der Hintergrundaufgabe warten. Sie müssen den Code in 'onPostExecute' implementieren. So funktionieren Rückrufe. –

+0

Okay, ich bin ziemlich neu in der Java-Umgebung, ich habe versucht, die OnPostExecute-Überschreibung hinzuzufügen, aber es wird nicht erkannt. Direkt nach dem Ende von doInBackground Function mache ich: @Override geschützter String onPostExecute (String Ergebnis) { zurück Ergebnis; } Was ist es, was ich vermisse, gibt es etwas, das ich gerade nicht begreife? Muss der onPostExecute einen booleschen Wert zurückgeben, will ich nur den String-Wert zurückgeben, wenn der Hintergrundprozess fertig ist! Mir wird gesagt, dass der onPostExecute mit der ausführbaren Datei doInBackground kollidiert. – RW6

Verwandte Themen