2012-07-01 3 views
2
public static class TestTask extends AsyncTask<Void, Integer, Integer> { 

    private String stacktrace; 

    public TestTask (String stacktrace){ 

     this.stacktrace = stacktrace; 
    } 

    @Override 
    protected Integer doInBackground(Void... params) { 

     try { 
      Log.i("async", "doInBackground 1"); //this gets logged 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost("http://xx.xx:8080/android/service.php"); 
      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
      nameValuePairs.add(new BasicNameValuePair("action", "logexception")); 
      nameValuePairs.add(new BasicNameValuePair("stacktrace", stacktrace)); 
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

      HttpResponse response = httpclient.execute(httppost); 
      Log.i("async", "doInBackground 2"); //this gets logged 
      return 1; 

     } catch (Exception e) { 
      e.printStackTrace(); 
      return 0; 
     } 

    } 

    protected void onPreExecute(){ 
     Log.i("async", "onPreExecute"); //this gets logged 
    } 

    @Override 
    protected void onPostExecute(Integer result) { 
     Log.i("async", "onPostExecute"); //this doenst get logged! 


    } 
} 

J'ai vérifié les autres threads SO à ce sujet, mais selon eux, mon code semble correct pour autant que je sache. Alors, pourquoi ne jamais atteindre Log.i("async", "onPostExecute");? MercionPostExecute n'a jamais été appelé?

+0

Ajoutez une instruction log pour voir si doInBackground() se termine réellement. –

+0

@RaghavSood 'Log.i (" async "," doInBackground 2 "); // ça se fait enregistrer »N'est-ce pas assez? – Johan

+0

Oh, c'est vrai. Je n'ai pas vu ça. Pardon. Essayez de supprimer l'annotation @Override et de l'exécuter. –

Répondre

1

Avez-vous créé votre AsyncTask sur UI Discussion? D'autres semblent bons. Les génériques et les annotations sont bien.

Donc, probablement le problème est que votre méthode doInBackground ne retourne jamais parce que onPostExecute est appelé automatiquement lorsque doInBackground quelque chose va revenir.

+0

Son effectivement appelé à partir de ma 'public class CustomExceptionHandler implémente UncaughtExceptionHandler'. Est-ce que cela pourrait être le problème? – Johan

+0

AsyncTask doit être exécuté sur le thread UI, donc dans votre activité. – Sajmon

+0

Mais tout le reste fonctionne bien ... – Johan

-1

Vous devez appeler le super dans onPostExecute()

donc votre code devrait ressembler à ceci:

@Override 
public void onPostExecute(Integer result) { 
    super.onPostExecute(result); 
    Log.i("async", "onPostExecute"); 
} 

Et cela devrait fonctionner

+1

Il est inutile d'appeler super.onPostExecute ... sa super méthode est vide. http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4.2_r1/android/os/AsyncTask.java#AsyncTask.onPostExecute%28java.lang. Object% 29 – Massimo