Comment traiter gracieusement l'exception dans AsyncTask dans Android?

J'ai un AsyncTask pour faire la migration de la base de données SQLite en arrière-plan (créer ou mettre à niveau). Disons que, d'une manière ou d'une autre, un IOException ou SQLiteException est lancé dans doInBackground et il est inutile que l'application continue à s'exécuter, car l'état de la base de données peut ne pas être dans l'état souhaité. Je suis un peu confus sur ce qu'il faut faire dans cette situation.

Je pense à laisser l'application bloquer le plus tôt possible et afficher la boîte de dialogue avec un message d'erreur, mais je ne sais pas vraiment comment cela se produit à l'intérieur de DoInBackground , car:

  1. Cette fonction n'est pas exécutée dans le thread UI, donc je ne sais pas si je peux afficher une boîte de dialogue.
  2. Je ne sais pas comment accéder à l'activité actuelle dans AsyncTask , donc je ne peux pas finir () .
  3. Je souhaite en quelque sorte jeter l'exception sur la couche supérieure et laisser une activité le gérer, mais ce n'est pas possible parce que doInBackground ne répertorie pas IOException comme une exception vérifiée.

Quelqu'un a-t-il des conseils sur la manière de gérer gracieusement cette situation?

3 Solutions collect form web for “Comment traiter gracieusement l'exception dans AsyncTask dans Android?”

Vous ne pouvez pas afficher la boîte de dialogue dans un thread non-ui. Vous pouvez passer la référence d'activité à une tâche asynchrone. Pour gérer cette situation, vous pouvez essayer d'attraper l'exception dans doInBackground et la lancer dans onPostExecute

par exemple

private class MyAsyncTaskTask extends AsyncTask<...> { private Activity ownerActivity; private Exception exceptionToBeThrown; public MyAsyncTaskTask(Activity activity) { // keep activity reference this.ownerActivity = activity; } protected Long doInBackground(...) { try { ... } catch (Exception e) { // save exception and re-thrown it then. exceptionToBeThrown = e; } } protected void onPostExecute(...) { // Check if exception exists. if (exceptionToBeThrown != null) { ownerActivity.handleXXX(); throw exceptionToBeThrown; } } } 

Si la tâche asynchrone est dans la classe Acvitiy, vous pouvez y accéder directement, par exemple,

 public class MyActivity extends Activity { ... AsyncTask<...> task = new AsyncTask<...>() { public void onPostExecute(...) { // Access activity directly MyActivity.this.xxx() } } } 

Renvoyez une chaîne unique chaque fois qu'une telle exception se produit dans doInBackground à onPostExecute. Et dans onPostExecute, affiche AlertDialog indiquant le message approprié et demande à essayer à nouveau ou quelque chose.

Ma démarche pour le gérer.

 /** * Created by Daniel on 02/04/2016. */ public abstract class AsyncTaskEnhanced<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> { // Avoids cyclic calls. private boolean onPostExecuteCalled = false; private Exception exception; @Override protected final Result doInBackground(Params... params) { try { return this.doInBackgroundWithFaultTolerance(params); } catch (Exception exception) { this.exception = nre; } return null; } @Override protected final void onPostExecute(Result result) { if (this.onPostExecuteCalled) return; this.onPostExecuteCalled = true; super.onPostExecute(result); this.onPostExecuteWithFaultTolerance(result, this.exception); } protected abstract Result doInBackgroundWithFaultTolerance(Params... params) throws Exception; protected abstract void onPostExecuteWithFaultTolerance(Result result, Exception ex); } 
coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.