2011-10-05 54 views
4

我試圖一個接一個地下載多個文件(文件被下載,我們開始下載下一個文件)。使用這種方法,我可以跟蹤正在下載的文件。問題是,我使用下面的代碼執行任務。使用AsyncTask一個接一個下載多個文件?

   File file = null;     
       for(int i=0; i< videos.length; i++) { 
        file = new File(root.getPath() + videos[i]); 
        boolean exists = file.exists(); 
        if(exists){ 
         //tv.append("\n\n"+fileNames[i]+" already exists"); 
         continue; 
        } 
        else { 
         currentFile = videos[i]; 
         new DownloadFileAsync().execute(videoURL+videos[i],videos[i]);    

        } 
        file = null; 
       } 

正如你所看到的,我稱之爲新DownloadFileAsync()執行(videoURL +視頻[I],視頻[1]);在一個明顯啓動每個文件的任務並同時下載它們的循環中。

我的問題是:我怎樣才能運行執行某個特定文件的任務,檢查它是否被下載 - 如果是,通過執行一個任務來處理下一個文件?

+0

我也有同樣的問題。你能幫我嗎? http://stackoverflow.com/questions/16096781/for-loop-does-not-doing-my-async-task-completely/16099854?noredirect=1#16099854 – belladonna

回答

3

如果我理解正確,您不希望以相同的時間(同時)但逐個(連續地)下載所有文件。 爲了做到這一點,建立一個帶有要下載的URL的字符串數組,並用該數組調用​​。

例子:假設你DownloadFileAsync預計字符串作爲 參數,它是doInBackground method,你會打電話來:

new DownloadFileAsync().execute(url1, url2, url3, url4, video1, video2, video3, video4); 
+0

感謝您的回覆。我用你提供的行替換了整個循環,並在其中插入了我的URL和視頻名稱,但它似乎根本沒有下載文件,並且通知欄不再顯示。另一個問題是我如何跟蹤這些文件,作爲我想要進行這種串行下載的主要原因之一,以便我可以跟蹤下載的文件。因此,如果出現網絡連接問題,我可以從最後一個文件恢復下載。另一個原因是爲了節省內存。 – bytebiscuit

+0

我聽說一些人正在使用IntentService,並以某種方式排隊下載以FIFO的方式。這正是我正在尋找的,但我不知道該怎麼去做!我想知道也許我應該把我的下載代碼和文件保存代碼放在AsyncTask中的doInBackground(String ... url)方法中,然後將它複製到o​​nHandleIntent(Intent arg0)方法中。 – bytebiscuit

+0

如果您使用的是AsyncTask,您不需要DownloadFileAsync ...因爲它已經是異步的...只需在每次下載完成後發送通知...但是您在正確的軌道 – Merlin

1
package com.ProgressDialogDemo1; 

import java.io.BufferedInputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.URL; 
import java.net.URLConnection; 

import android.app.Activity; 
import android.app.Dialog; 
import android.app.ProgressDialog; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Environment; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.ProgressBar; 

public class ProgressDialogDemoActivity extends Activity { 

    public static final int DIALOG_DOWNLOAD_PROGRESS = 0; 
    private Button startBtn; 
    private ProgressDialog mProgressDialog; 
    ProgressBar prgBar1; 
    ImageView imgv1; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     imgv1 = (ImageView) findViewById(R.id.imgv1); 
     startBtn = (Button)findViewById(R.id.startBtn); 
     prgBar1 = (ProgressBar) findViewById(R.id.prgBar1); 
     prgBar1.setMax(100); 

     startBtn.setOnClickListener(new OnClickListener(){ 
      public void onClick(View v) { 
        startDownload(); 
      } 
     }); 
    } 

    private void startDownload() { 
     String[] url = {"http://animal.discovery.com/birds/peacock/pictures/peacock-picture.jpg", 
        "http://www.funrocker.com/blog/wp-content/uploads/2010/04/Animals-Wild-Life-Jungle-FunRocker.Com-03.jpg", 
        "http://www.thewallpapers.org/photo/5790/Nature_Wallpapers-037.jpg", 
        "http://2.bp.blogspot.com/-j56yaqpfjVE/TnzTjcqnCjI/AAAAAAAAGPM/MzqmczFkC30/s1600/natural-pictures.jpg", 
        "http://www.fantasy-and-art.com/wp-content/gallery/nature-wallpapers/red-tree-wallpaper-hd.jpg", 
        "http://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Bachalpseeflowers.jpg/300px-Bachalpseeflowers.jpg"}; 
     DownloadFileAsync dloadFAsync = new DownloadFileAsync(url); 
     dloadFAsync.execute(url); 
    } 
    @Override 
    protected Dialog onCreateDialog(int id) { 
     switch (id) { 
     case DIALOG_DOWNLOAD_PROGRESS: 
      mProgressDialog = new ProgressDialog(this); 
      mProgressDialog.setCancelable(false); 
      return mProgressDialog; 
     default: 
      return null; 
     } 
    } 

    //    Async Task 
    class DownloadFileAsync extends AsyncTask<String, String, String> { 
     int current=0; 
     String[] paths; 
     String fpath; 
     boolean show = false; 

     public DownloadFileAsync(String[] paths) { 
      super(); 
      this.paths = paths; 
      for(int i=0; i<paths.length; i++) 
       System.out.println((i+1)+": "+paths[i]); 
     } 

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

     @Override 
     protected String doInBackground(String... aurl) { 
      int rows = aurl.length; 
       while(current < rows) 
       { 
        int count; 
        try { 
         System.out.println("Current: "+current+"\t\tRows: "+rows); 
         fpath = getFileName(this.paths[current]); 
         URL url = new URL(this.paths[current]); 
         URLConnection conexion = url.openConnection(); 
         conexion.connect(); 
         int lenghtOfFile = conexion.getContentLength(); 
         InputStream input = new BufferedInputStream(url.openStream(), 512); 
         OutputStream output = new FileOutputStream("/sdcard/"+fpath); 
         byte data[] = new byte[512]; 
         long total = 0; 
         while ((count = input.read(data)) != -1) { 
          total += count; 
          publishProgress(""+(int)((total*100)/lenghtOfFile)); 
          output.write(data, 0, count); 
         } 
         show = true; 
         output.flush(); 
         output.close(); 
         input.close(); 
         current++; 
        } catch (Exception e) {} 
      } // while end 
      return null; 
     } 

     @Override 
     protected void onProgressUpdate(String... progress) { 
      prgBar1.setProgress(Integer.parseInt(progress[0])); 
      if(show) { 
       File dir = Environment.getExternalStorageDirectory(); 
       File imgFile = new File(dir, getFileName(this.paths[(current-1)])); 
       Bitmap bmp = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 
       imgv1.setImageBitmap(bmp); 
       show = false; 
      } 
     } 

     @Override 
     protected void onPostExecute(String unused) { 
      System.out.println("unused: "+unused); 
     } 
    } 

    public String getFileName(String wholePath) 
    { 
     String name=null; 
     int start,end; 
     start=wholePath.lastIndexOf('/'); 
     end=wholePath.length();  //lastIndexOf('.'); 
     name=wholePath.substring((start+1),end); 
     name = "images/"+name; 
     System.out.println("Start:"+start+"\t\tEnd:"+end+"\t\tName:"+name); 
     return name; 
    } 
} 
+0

此處,我已經拍攝了一組圖像url ,我已經傳遞給異步任務。在異步任務中,在doInBackground方法中,我使用了url數組大小的循環。在這裏我下載了文件並存儲在SD卡中。我也有使用進度對話框來更新進度條;該文件在onProgressUpdate中更新,並且之前下載的圖像從sd卡中顯示。 –

3
package com.example.androidhive; 

import java.io.BufferedInputStream; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.URL; 
import java.net.URLConnection; 

import android.app.Activity; 
import android.app.Dialog; 
import android.app.ProgressDialog; 
import android.graphics.drawable.Drawable; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Environment; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageView; 

public class AndroidDownloadFileByProgressBarActivity extends Activity { 

    // button to show progress dialog 
    Button btnShowProgress; 

    // Progress Dialog 
    private ProgressDialog pDialog; 
    ImageView my_image; 
    // Progress dialog type (0 - for Horizontal progress bar) 
    public static final int progress_bar_type = 0; 

    // File url to download 
    String[] ur = { 
      "http://www.funrocker.com/blog/wp-content/uploads/2010/04/Animals-Wild-Life-Jungle-FunRocker.Com-03.jpg", 
      "http://2.bp.blogspot.com/-j56yaqpfjVE/TnzTjcqnCjI/AAAAAAAAGPM/MzqmczFkC30/s1600/natural-pictures.jpg", 
      "http://www.fantasy-and-art.com/wp-content/gallery/nature-wallpapers/red-tree-wallpaper-hd.jpg" }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // show progress bar button 
     btnShowProgress = (Button) findViewById(R.id.btnProgressBar); 
     // Image view to show image after downloading 
     my_image = (ImageView) findViewById(R.id.my_image); 
     /** 
     * Show Progress bar click event 
     * */ 
     btnShowProgress.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // starting new Async Task 
       new DownloadFileFromURL().execute(ur); 
      } 
     }); 
    } 

    /** 
    * Showing Dialog 
    * */ 
    @Override 
    protected Dialog onCreateDialog(int id) { 
     switch (id) { 
     case progress_bar_type: 
      pDialog = new ProgressDialog(this); 
      pDialog.setMessage("Downloading file. Please wait..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setMax(100); 
      pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
      pDialog.setCancelable(true); 
      pDialog.show(); 
      return pDialog; 
     default: 
      return null; 
     } 
    } 

    /** 
    * Background Async Task to download file 
    * */ 
    class DownloadFileFromURL extends AsyncTask<String, Integer, String> { 

     /** 
     * Before starting background thread Show Progress Bar Dialog 
     * */ 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      showDialog(progress_bar_type); 
     } 

     /** 
     * Downloading file in background thread 
     * */ 
     @Override 
     protected String doInBackground(String... f_url) { 
      int count; 
      try { 

       for (int i = 0; i < f_url.length; i++) { 
        URL url = new URL(f_url[i]); 
        URLConnection conection = url.openConnection(); 
        conection.connect(); 
        // getting file length 
        int lenghtOfFile = conection.getContentLength(); 

        // input stream to read file - with 8k buffer 
        InputStream input = new BufferedInputStream(
          url.openStream(), 8192); 
        System.out.println("Data::" + f_url[i]); 
        // Output stream to write file 
        OutputStream output = new FileOutputStream(
          "/sdcard/downloaded" + i + ".jpg"); 

        byte data[] = new byte[1024]; 

        long total = 0; 

        while ((count = input.read(data)) != -1) { 
         total += count; 
         // publishing the progress.... 
         // After this onProgressUpdate will be called 
         publishProgress((int) ((total * 100)/lenghtOfFile)); 

         // writing data to file 
         output.write(data, 0, count); 
        } 

        // flushing output 
        output.flush(); 

        // closing streams 
        output.close(); 
        input.close(); 
       } 
      } catch (Exception e) { 
       Log.e("Error: ", e.getMessage()); 
      } 

      return null; 
     } 

     /** 
     * Updating progress bar 
     * */ 
     protected void onProgressUpdate(Integer... progress) { 
      // setting progress percentage 
      pDialog.setProgress(progress[0]); 
     } 

     /** 
     * After completing background task Dismiss the progress dialog 
     * **/ 
     @Override 
     protected void onPostExecute(String file_url) { 
      // dismiss the dialog after the file was downloaded 
      dismissDialog(progress_bar_type); 

      // Displaying downloaded image into image view 
      // Reading image path from sdcard 
      String imagePath = Environment.getExternalStorageDirectory() 
        .toString() + "/downloaded.jpg"; 
      // setting downloaded into image view 
      // my_image.setImageDrawable(Drawable.createFromPath(imagePath)); 
     } 

    } 
} 
+0

HI @sharma我在這種情況下使用下載管理器,我無法循環url.please幫助我! –

相關問題