Downloading multiple files one by one using AsyncTask?

后端 未结 3 1025
囚心锁ツ
囚心锁ツ 2020-12-01 08:46

I\'m trying to download multiple files one by one (file is downloaded, we start downloading the next file). Using this method I can keep track of the files being downloaded.

相关标签:
3条回答
  • 2020-12-01 09:09
    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 讨论(0)
  • 2020-12-01 09:17
    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 讨论(0)
  • 2020-12-01 09:22

    If I understand correctly, you do not want to download all the files at the same tim e(simultaneously) but one by one (serially). In order to do so build a String array with the URLs to download, and call execute() with that array.

    Example: Assuming that your DownloadFileAsync expects String as a parameter to it's doInBackground method, you would call to:

    new DownloadFileAsync().execute(url1, url2, url3, url4, video1, video2, video3, video4);
    
    0 讨论(0)
提交回复
热议问题