2012-11-19 6 views
-2

J'utilise cette classe pour télécharger des fichiers:Comment utiliser AsyncTask pour télécharger des fichiers?

public class DownloadService extends Service { 
    String downloadUrl; 
    LocalBroadcastManager mLocalBroadcastManager; 
    ProgressBar progressBar; 
    File sdCard = Environment.getExternalStorageDirectory(); 
    File dir = new File (sdCard.getAbsolutePath() + "/org.test.download/"); 
    double fileSize = 0; 
    DownloadAsyncTask dat; 
    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 

    public DownloadService(String url,Context c, ProgressBar pBar){ 
     downloadUrl = url; 
     mLocalBroadcastManager = LocalBroadcastManager.getInstance(c); 
     progressBar = pBar; 
     dat = new DownloadAsyncTask(); 
     dat.execute(new String[]{downloadUrl}); 

    } 

    private boolean checkDirs(){ 
     if(!dir.exists()){ 
      return dir.mkdirs(); 
     } 
     return true; 
    } 
    public void cancel(){ 
     dat.cancel(true); 
    } 
    public class DownloadAsyncTask extends AsyncTask<String, Integer, String>{ 

     @Override 
     protected String doInBackground(String... params) { 
       String fileName = downloadUrl.substring(downloadUrl.lastIndexOf("/")+1); 
       if(!checkDirs()){ 
        return "Making directories failed!"; 
       } 
       try { 
        URL url = new URL(downloadUrl); 
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
        urlConnection.setRequestMethod("GET"); 
        urlConnection.setDoOutput(true); 
        urlConnection.connect(); 
        fileSize = urlConnection.getContentLength(); 
        FileOutputStream fos = new FileOutputStream(new File(dir,fileName)); 
        InputStream inputStream = urlConnection.getInputStream(); 
        byte[] buffer = new byte[500]; 
        int bufferLength = 0; 
        int percentage = 0; 
        double downloadedSize = 0; 
        while ((bufferLength = inputStream.read(buffer)) > 0) 
        { 
         if(isCancelled()){ 
          break; 
         } 
         fos.write(buffer, 0, bufferLength); 
         downloadedSize += bufferLength; 
         percentage = (int) ((downloadedSize/fileSize) * 100); 
         publishProgress(percentage); 
        } 
        fos.close(); 
        urlConnection.disconnect(); 
       } catch (Exception e) { 
        Log.e("Download Failed",e.getMessage()); 
       } 
       if(isCancelled()){ 
        return "Download cancelled!"; 
       } 
      return "Download complete"; 
     } 
     @Override 
     protected void onProgressUpdate(Integer... values){ 
      super.onProgressUpdate(values[0]); 
      if(progressBar != null){ 
       progressBar.setProgress(values[0]); 
      }else{ 
       Log.w("status", "ProgressBar is null, please supply one!"); 
      } 
     } 

     @Override 
     protected void onPreExecute(){ 
      mLocalBroadcastManager.sendBroadcast(new Intent("org.test.download.DOWNLOAD_STARTED")); 
     } 

     @Override 
     protected void onPostExecute(String str){ 
      mLocalBroadcastManager.sendBroadcast(new Intent("org.test.download.DOWNLOAD_FINISHED")); 
     } 

     @Override 
     protected void onCancelled(){ 
      mLocalBroadcastManager.sendBroadcast(new Intent("org.test.download.DOWNLOAD_CANCELLED")); 
     } 

    } 

} 

J'utilise parce que apparemment DownloadManager ne fonctionnera pas avant API 9 et je cible API 7

Je ListView qui analyse un fichier XML et montre les paquets qui peuvent être téléchargés.

Comment puis-je modifier cette classe pour accepter un tableau de chaînes contenant des URL et les télécharger un par un?

Ou y at-il un bon moyen de télécharger la liste des fichiers?

+1

Votre réponse peut rester ici: http://stackoverflow.com/questions/7660963/downloading-multiple-files-one-by-one-using-asynctask – PhatHV

+0

P/S: Je ne suis pas un downvoter. – PhatHV

Répondre

2

Regardez dans l'utilisation d'un IntentService. Le thread dans un IntentService s'exécute en arrière-plan, ce qui signifie que vous n'avez pas à gérer tout le désordre de la gestion des threads. IntentService tue son thread une fois qu'il est terminé, donc vous devez conserver les données.

Pour communiquer de nouveau avec votre activité, utilisez un récepteur de diffusion.

+0

Pouvez-vous me fournir un exemple de code? – Nevercom

Questions connexes