15

J'utilise AsyncTask pour effectuer des calculs d'arrière-plan, mais je ne parviens pas à trouver la manière correcte de gérer les exceptions. Actuellement, je suis en utilisant le code suivant:Gestion des erreurs d'administration asynchrone

private class MyTask extends AsyncTask<String, Void, String> 
{ 
    private int e = 0; 

    @Override 
    protected String doInBackground(String... params) 
    { 
     try 
     { 
      URL url = new URL("http://www.example.com/"); 
     } 
     catch (MalformedURLException e) 
     { 
      e = 1; 
     } 

     // Other code here... 

     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) 
    { 
     if (e == 1) 
      Log.i("Some Tag", "An error occurred."); 

     // Perform post processing here... 
    } 
} 

Je crois que la variable e maye être écrite/accessible par deux le thread principal et travailleur. Comme je sais que onPostExecute() ne sera exécuté qu'après doInBackround() a terminé, puis-je omettre toute synchronisation?

Est-ce un mauvais code? Existe-t-il une manière convenue ou correcte de gérer les exceptions dans un AsyncTask?

+1

double possible de [AsyncTask et traitement des erreurs sur Android] (http://stackoverflow.com/questions/1739515/asynctask-and-error-handling-on-android) – blahdiblah

Répondre

3

Je l'ai fait dans mes applications, je suppose qu'il n'y a pas de meilleure façon. Vous pouvez également lire le Mark Murphy answer à ce sujet.

+0

Si elle ne provoque pas problèmes alors je suis heureux! – Leo

2

Ceci est garanti pour fonctionner, même sur l'architecture de SMP. Toute la synchronisation est faite pour vous. Il serait cependant préférable d'utiliser la valeur de retour pour le faire.

+1

Dans le code actuel, j'utilise un objet personnalisé comme type de retour qui ne se prête pas vraiment à la détention d'informations d'exception. Je suppose que je ne peux pas surcharger la fonction 'onPostExecute()' très facilement? – Leo

+4

Tout d'abord, doInBackground doit renvoyer un objet du même type que le paramètre dans onPostExecute(). Ensuite, vous pouvez simplement créer une classe personnalisée pour encapsuler le résultat + exception: class ResultHolder {Exception e; MyResult r; } –

2

Je pense que votre code serait à la tâche, mais il existe déjà une sorte de gestion des erreurs intégré dans la classe .

Vous pouvez éviter d'utiliser une variable supplémentaire en utilisant la méthode cancel() et sa méthode de gestionnaire onCancelled(). Lorsque vous appelez annuler dans la méthode doInBackground() la méthode onCancelled dans le thread UI. Que vous appeliez annuler (vrai) ou annuler (faux) dépend de vos besoins.


private class MyTask extends AsyncTask<String, Void, String> 
{  
    @Override 
    protected NewsItem doInBackground(String... params) 
    { 
     try 
     { 
      URL url = new URL("http://www.example.com/"); 
     } 
     catch (MalformedURLException e) 
     { 
      cancel(false/true); 
     } 

     // Other code here... 

     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) 
    {    
     // Perform successful post processing here... 
    } 

    @Override 
    protected void onCancelled() { 
     super.onCancelled(); 
     // Perform error post processing here... 
    } 
} 
+0

Cette méthode ne fonctionne que si nous avons un type d'exception. Dans mon code complet, il y a plusieurs choses qui peuvent mal tourner et qui doivent être traitées différemment. – Leo

+0

Pourquoi? Vous pouvez ajouter à la clause d'essai autant de catch-class que vous le souhaitez. Dans chaque catch-statement, vous pouvez appeler la méthode cancel. Vous pouvez également attraper (Exception e) qui attrape tous les types d'exceptions. Est-ce que j'ai eu raison, Leo? Cependant, est-ce une bonne pratique d'appeler cancel() lorsque des exceptions sont levées ou existe-t-il un autre moyen de gestion des exceptions implémenté? – OneWorld

+0

La façon dont annule() la gestion de l'erreur est très proche de ce qui se passe réellement. Votre traitement a été annulé en raison d'une erreur. Vous pouvez toujours enregistrer un certain état sur la ASyncTask qui peut être lu par le thread de l'interface utilisateur pour obtenir plus d'informations sur l'erreur. – DukeMe