2017-10-03 3 views
0

J'ai tout essayé, mais rien ne fonctionne. J'essaie d'appeler un Api, ce qui fonctionne. Cependant, onPostExecute() n'est pas appelé ce qui fait que mon callback ne fonctionne pas.AsyncTask: onPostExecute() n'est pas invoqué

C'est ma classe AsyncTask:

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

C'est là que AsyncTask est appelée:

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

C'est là mon rappel se trouve:

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

Merci à l'avance !

+0

doInBackground() est-il appelé ou même pas? – Kriti

+0

On l'appelle! La chaîne de résultat contient le code JSON –

+0

Peut-être que le serveur prend trop de temps à répondre. Essayez d'utiliser 'connection.setConnectTimeout (10000);' pour vous assurer que la fonction retourne toujours.Essayez également de déboguer votre application en plaçant des points d'arrêt sur différentes lignes de votre méthode 'doInBackground'. –

Répondre

0

Peut-être que vous avez une autre exception doInBackground() Méthode ajouter ce bloc catch à vos prises try:

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

et également vérifier votre journal et assurez-vous que votre ligne de journal est imprimé dans logcat
pour que vous ayez ceci:

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

Merci, mais je n'ai aucune exception se jeter. –

0

Il pourrait y avoir une exception dans votre appel réseau qui est retourné et donc nul est envoyé comme result.Also vous retournerez en résultat et essayer d'envoyer à nouveau nul comme résultat à l'en d de la méthode qui obtient overridden.So modifier votre code comme celui-ci

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

Merci, mais ça n'aide pas malheureusement! –

+0

oh je devinais que vous remplaciez le résultat du serveur – Anonymous

1

Sur le site des développeurs android officiel:

Il y a quelques règles de filetage qui doivent être suivies pour cette classe travailler correctement:

  • La classe AsyncTask doit être chargée sur le thread d'interface utilisateur. Ceci est fait automatiquement à partir de JELLY_BEAN.
  • L'instance de tâche doit être créée sur le thread d'interface utilisateur. Execute (Params ...) doit être appelée sur le thread de l'interface utilisateur.
  • Ne pas appeler onPreExecute(), onPostExecute (résultat), doInBackground (paramètres ...), onProgressUpdate (progression ...) manuellement. La tâche peut être exécutée qu'une seule fois (une exception sera levée si une seconde exécution est tentée.)

Je tiens à souligner au 3ème balle. execute doit être appelée sur le thread UI. Dans votre code, il montre que execute est appelée à partir d'une méthode getString() mais il n'est pas clair si cette méthode existe dans une classe appartenant au thread d'interface utilisateur, par exemple. une activité. Je suppose qu'il n'y a pas de thread d'interface utilisateur dans lequel la méthode onPostExecute peut être exécutée.

+0

Bonjour, cette méthode appartient à une classe appelée Connexion. Ce n'est pas une activité, mais elle est créée dans un référentiel et ce référentiel est créé dans une activité. Donc, je devrais être sur le fil de l'interface utilisateur droite? –

+0

Yeap, vous devez créer et l'appeler dans votre activité! Voir les puces 2 et 3 – pleft

+0

@pleft exécutera-t-ilOnUiThread? –