2017-10-03 2 views
0

Ich habe alles versucht, aber nichts funktioniert.AsyncTask: onPostExecute() wird nicht aufgerufen

Ich versuche eine Api aufzurufen, die funktioniert. OnPostExecute() wird jedoch nicht aufgerufen, was dazu führt, dass mein Callback nicht funktioniert.

Das ist mein AsyncTask Klasse:

class RetrieveInput extends AsyncTask<String, String, String> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     try { 
      URL url = new URL(params[0]); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.setRequestMethod("GET"); 
      InputStream stream = connection.getInputStream(); 
      Scanner s = new Scanner(stream).useDelimiter("\\A"); 
      String result = s.hasNext() ? s.next() : ""; 
      return result; 
     } catch (IOException ex) { 
      Log.d("Error", "Error fetching data"); 
      Log.d("STACKTRACE", ex.getStackTrace().toString()); 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     repo.setString(result); 
    } 
} 

Hier wird die AsyncTask aufgerufen wird:

public void getString() { 
    if (url != null) { 
     RetrieveInput input = new RetrieveInput(); 
     input.execute(url); 
    } 
} 

Dies ist, wo mein Rückruf befindet: Voraus

public class UserRepository implements IRepository { 

    private Connection connection; 
    private String result; 
    private Gson gson; 

    public UserRepository() { 
     this.connection = new Connection(this); 
     this.gson = new Gson(); 
    } 

    public User find(String userName) { 
     connection.setUrl("http://10.0.2.2:8080/api-0.1.0/users/get/" + userName); 
     connection.getString(); 
     User user = gson.fromJson(this.result, User.class); 
     return user; 
    } 

    @Override 
    public void setString(String result) { 
     this.result = result; 
    } 
} 

Danke !

+0

wird doInBackground() aufgerufen oder auch das ist nicht? – Kriti

+0

Es wird aufgerufen! Die Ergebniszeichenfolge enthält die JSON –

+0

. Möglicherweise dauert die Antwort des Servers zu lange. Verwenden Sie 'connection.setConnectTimeout (10000);', um sicherzustellen, dass die Funktion immer zurückkehrt.Versuchen Sie auch, Ihre App zu debuggen, indem Sie Haltepunkte in verschiedenen Zeilen Ihrer 'doInBackground'-Methode platzieren. –

Antwort

0

Vielleicht haben Sie eine weitere Ausnahme in doInBackground() Methode dieser catch-Block zu Ihrem try catch hinzufügen:

catch (Exception ex) { 
    ex.getStackTrace() 
} 

und auch Ihre Log überprüfen und sicherstellen, dass Ihre Log-Zeile gedruckt wird, nicht in logcat
so müssen Sie dies:

try { 
    URL url = new URL(params[0]); 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
    connection.setRequestMethod("GET"); 
    InputStream stream = connection.getInputStream(); 
    Scanner s = new Scanner(stream).useDelimiter("\\A"); 
    String result = s.hasNext() ? s.next() : ""; 
    return result; 
}catch (IOException ex) { 
    Log.d("Error", "Error fetching data"); 
    Log.d("STACKTRACE", ex.getStackTrace().toString()); 
} catch (Exception ex) { 
    ex.getStackTrace() 
} 
+0

Danke, aber ich habe keine Ausnahmen bekommen geworfen. –

0

Es könnte eine Ausnahme in Ihrem Netzwerk Anruf sein, der zurückgegeben wird und somit null als result.Also Sie zurückgeben Ergebnis in Versuch und erneut zu senden null als Ergebnis an dem en gesendet d des Verfahrens, die wie dieser

String dataResult = null; 
    try { 
     URL url = new URL(params[0]); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setRequestMethod("GET"); 
     InputStream stream = connection.getInputStream(); 
     Scanner s = new Scanner(stream).useDelimiter("\\A"); 
     String result = s.hasNext() ? s.next() : ""; 
     dataResult = result; 
    } catch (IOException ex) { 
     Log.d("Error", "Error fetching data"); 
     Log.d("STACKTRACE", ex.getStackTrace().toString()); 
    } finally { 
     return dataResult; 
    } 
+0

Danke, aber es hilft leider nicht! –

+0

oh ich vermutete, Sie überschreiben das Ergebnis vom Server – Anonymous

1

Von der offiziellen Android-Entwickler-Website overridden.So ändern Sie den Code bekommt:

Es gibt ein paar Regeln, die Threading für diese Klasse befolgt werden müssen arbeiten richtig:

  • Die AsyncTask-Klasse muss im UI-Thread geladen werden. Dies geschieht automatisch ab JELLY_BEAN.
  • Die Task-Instanz muss im UI-Thread erstellt werden.
  • Ausführen (Params ...) muss im UI-Thread aufgerufen werden.
  • Nicht onPreExecute(), OnPostExecute (Ergebnis), DoInBackground (Params ...), OnProgressUpdate (Progress ...) manuell aufrufen. Die Aufgabe kann nur einmal ausgeführt werden (eine Ausnahme ausgelöst wird, wenn eine zweite Ausführung versucht wird.)

ich im 3. Geschoss betonen würde. execute muss auf dem UI Thread aufgerufen werden. In Ihrem Code wird angezeigt, dass execute von einer getString()-Methode aufgerufen wird, aber es ist nicht klar, ob diese Methode in einer Klasse vorhanden ist, die zum UI-Thread gehört, z. eine Aktivität. Ich nehme an, dass es keinen UIhread gibt, in dem die onPostExecute Methode ausgeführt werden kann.

+0

Hallo, diese Methode gehört zu einer Klasse namens Connection. Es ist keine Aktivität, aber es wird in einem Repository erstellt und dieses Repository wird in einer Aktivität erstellt. Also sollte ich auf dem UI-Thread richtig sein? –

+0

Yeap, du musst es in deiner Aktivität erstellen und aufrufen! Siehe Kugeln 2 und 3 – pleft

+0

@pleft wird runOnUiThread arbeiten? –

Verwandte Themen