2011-02-24 4 views
2

Ceci est lié à mon précédent post Problem with downloading multiple files using AsyncTaskComment récupérer l'état d'achèvement des tâches dans AsyncTask

Je suis en train de télécharger deux fichiers vidéo et montrent aussi un ProgressDialog au cours du processus. Pour cela, j'utilise AsyncTask. Je veux que le 1er téléchargement se termine, libère de la mémoire puis commence le 2ème téléchargement. J'ai écrit le code suivant pour y parvenir, mais il semble que le deuxième téléchargement ne commence jamais.

startDownload() { 
    DownloadFileAsync d1 = new DownloadFileAsync(); 
    d1.execute(videoPath+fileNames[0],fileNames[0]); 

    if(d1.getStatus()==AsyncTask.Status.FINISHED) { 
    d1 = null; 
    DownloadFileAsync d2 = new DownloadFileAsync(); 
    d2.execute(videoPath+fileNames[1],fileNames[1]); 
    } 
} 

Est-il possible que je puisse retourner l'état d'avancement de ma 1ère tâche & puis démarrer le 2ème?

Voici le code de ma classe DownloadFileAsync:

class DownloadFileAsync extends AsyncTask<String, String, String> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     showDialog(DIALOG_DOWNLOAD_PROGRESS); 
    } 

    @Override 
    protected String doInBackground(String... aurl) { 
     int count; 

     try { 
      URL url = new URL(aurl[0]); 
      URLConnection conexion = url.openConnection(); 
      conexion.connect(); 

      File root = android.os.Environment.getExternalStorageDirectory(); 

      int lenghtOfFile = conexion.getContentLength(); 
      Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile); 

      InputStream input = new BufferedInputStream(url.openStream()); 
      OutputStream output = new FileOutputStream(root.getAbsolutePath() + "/videos/" + aurl[1]); 

      byte data[] = new byte[1024]; 

      long total = 0; 

      while ((count = input.read(data)) != -1) { 
       total += count; 
       publishProgress(""+(int)((total*100)/lenghtOfFile)); 
       output.write(data, 0, count);      
      } 
      output.flush(); 
      output.close();     
      input.close(); 

     } catch (Exception e) {} 
     return null; 

    } 
    protected void onProgressUpdate(String... progress) { 
     Log.d("ANDRO_ASYNC",progress[0]); 
     mProgressDialog.setProgress(Integer.parseInt(progress[0])); 
    } 

    @Override 
    protected void onPostExecute(String unused) { 
     dismissDialog(DIALOG_DOWNLOAD_PROGRESS); 
     tv.append("\n\nFile Download Completed!"); 
     sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));    
    } 
} 

Répondre

1

Comme DKIT Android suggéré, vous pourriez commencer le deuxième téléchargement à partir onPostExecute, mais seulement si par exemple download2 est nul

@Override 
protected void onPostExecute(String unused) 
{ 

    if (d2 == null) 
    { 
     d2 = new DownloadFileAsync(); 
     d2.execute(videoPath+fileNames[1],fileNames[1]);  
    }  
} 

Si vous avez besoin pour commencer plus de téléchargements, il suffit d'écrire la méthode en dehors de votre AsyncTask, qui va vérifier quel téléchargement doit être commencé ensuite.

1

Démarrez votre deuxième téléchargement à partir de votre première méthode onPostExecute.

Ce code:

if(d1.getStatus()==AsyncTask.Status.FINISHED) { 
d1 = null; 
DownloadFileAsync d2 = new DownloadFileAsync(); 
d2.execute(videoPath+fileNames[1],fileNames[1]); 

}

... exécutera une fois, et immédiatement après la première AsyncTask est exécuté, donc il sera toujours faux. Si vous voulez aller sur cette route, vous devez le faire dans une boucle while - ce qui, en quelque sorte, va à l'encontre de la tâche asynchrone.

+0

Mais dans l'application réelle, je dois télécharger plusieurs fichiers, pas seulement 2. Alors, y a-t-il un autre moyen d'y parvenir? – Sourav

+0

J'ai essayé d'y mettre une boucle while while (d1.getStatus() == AsyncTask.Status.RUNNING) {...} mais l'application entière s'est bloquée. Donc, je me demandais s'il y avait une meilleure façon de le faire. – Sourav

+0

J'ai gardé le code pour le 2ème téléchargement dans la méthode onPostExecute(). Mais la 2ème tâche a continué à s'exécuter pour un nombre infini de fois. S'il vous plaît montrez-moi comment implémenter cette logique pour 5 tâches continues (téléchargements) – Sourav

Questions connexes