2013-08-30 4 views
-1

J'ai un asynctask exécuté dans onCreateView dans un fragment. Lorsque l'écran est éteint et que le fragment doit être affiché, l'asynctask démarre mais isCancelled() est vrai. J'ai utilisé PARTIAL_WAKE_LOCK mais le problème n'est pas résolu. Merci d'avance.Android AsyncTask s'exécute avec isCancelled() = true lorsque l'écran est éteint

Voici un exemple de code

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     super.onCreateView(inflater, container, savedInstanceState); 
     activity = getSherlockActivity(); 
     context = activity.getApplicationContext(); 
     view = inflater.inflate(R.layout.main, container, false); 

     DownloadXMLTask = new DownloadXML(getActivity()); 
     DownloadXMLTask.execute(file); 

     return view; 
    } 

private class DownloadXML extends AsyncTask<File, Integer, String> { 

     private Activity activity; 

     public DownloadXML(Activity activity) { 
      this.activity = activity; 
     } 

     protected void onPreExecute() { 
      ... Do stuff ... 
     } 

     protected String doInBackground(File... files) { 
      // Check if the task is cancelled 
      if (isCancelled()) { return null; } 

      ... Do stuff ... 
      ... Do stuff ... 
      ... Do stuff ... 

      return null; 

     } 

     protected void onPostExecute(String result) { 
      ... Do stuff ... 
     } 

     @Override 
     protected void onCancelled() { 
      ... Do stuff ... 
     } 
    } 
+0

Vous avez décrit le comportement, mais pas le comportement souhaité. –

+0

Merci pour le commentaire. J'ai besoin de la tâche à exécuter comme prévu le même lorsque l'écran est allumé. Il devrait être annulé seulement quand l'utilisateur cause l'annulation. – adamioan

+1

@adamioan: Lorsque "l'écran est éteint", votre "Activité" et les "Fragments" ne seront plus en cours d'exécution. Si vous voulez effectuer un traitement en arrière-plan tel que des téléchargements, utilisez un 'Service'. – Squonk

Répondre

0

Si vous voulez exécuter quelque chose, peu importe si votre activité est en cours d'exécution, il doit être dans un service. Il est probablement plus facile de commencer avec un IntentService, qui traite automatiquement chaque intention dans un thread d'arrière-plan. De l'activité, faites une intention qui décrit le travail à effectuer, et startService votre service en utilisant cette intention. Donnez le code onHandleIntent de votre intention à votre code doInBackground. Vous pouvez le faire livrer le résultat à l'activité dans une diffusion, ou via un autre mécanisme tel que la mise à jour d'un ContentProvider.

+0

Merci pour la réponse. J'ai réussi à résoudre ce problème en ajoutant le code d'exécution asynctask dans ** onResume ** plutôt que ** onCreateView **. La première exécution du code sera annulée, mais lorsque l'utilisateur active l'écran, ** onResume ** ré-exécute la tâche asynchrone. – adamioan

Questions connexes