在单个进度条中下载文件

时间:2013-01-01 01:08:02

标签: java android android-asynctask progress-bar

我有一个由AsyncTask管理的进度条,可以从互联网上下载一些文件。

private class DownloadImgs extends AsyncTask<Void, String, Void> {

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


            @Override
            protected Void doInBackground(Void ...params) {
               for(GetCountry gc : listCountry){
           getdownloadedFiles(gc.getUrl());}

           return null;

            }


            protected void onProgressUpdate(String... progress) {

                pDialog.setProgress(Integer.parseInt(progress[0]));
           }

            @Override
            protected void onPostExecute(Void result) {

                dismissDialog(progress_bar_type);


            }

允许我下载文件的方法:

public void getdownloadedFiles(String url)

            {

                int count;
                 try {

                  URL urlImg = new URL(url);
                  URLConnection connection = urlImg.openConnection();
                  connection.connect();

                  int lenghtOfFile = connection.getContentLength();
                  InputStream input = new BufferedInputStream(urlImg.openStream(), 8192);


                  OutputStream output = new FileOutputStream(folder+"/"+name);

                  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) {
                     e.getMessage();
                 }


            }

此代码运行良好,但问题是每个下载的文件都有自己的进度条 我只想为所有下载的文件添加一个进度条。

我怎样才能做到这一点? 非常感谢你

2 个答案:

答案 0 :(得分:0)

将多个网址传递给您的异步任务。

new DownloadImgs().execute(URL1,URL2,URL3);

它会将整个进度显示为单个进度条。

答案 1 :(得分:0)

doInBackground()方法中,只需在AsyncTask的单次执行中循环浏览需要下载的文件列表。您还应该利用execute()的varargs性质来传递您需要下载的URL列表。换句话说,接近这个:

DownloadImgs task = new DownloadImgs();
task.execute(url1, url2, url3, url4, url5);

修改任务:

private class DownloadImgs extends AsyncTask<String, String, Void> {

    @Override
    protected Void doInBackground(String ...params) {

        for (String url : params) {
            getdownloadedFiles(url);
        }

        return null;
    }

    public void getdownloadedFiles(String url) {
        /* Existing code */
    }

    /* Other methods unchanged */
}

修改

您可以使用一种方法将所有文件下载显示为单个连续进度指示器,只需按文件计数而不是文件内容更新进度。换句话说,如果您有5个文件publishProgress(),其值为20(1 * 100/5),40(2 * 100/5),60(3 * 100/5),80(4 * 100) / 5),每个文件下载结束时100(5 * 100/5)。

如果您需要更精细的内容而无需预先获取每个文件的内容长度,请使用百分比增加每个块增量。请注意,您还可以将setMax()的进度条的最大级别设置为100以外的值,以便更轻松地使用数学运算。在相同的5个文件示例中,您可以将进度条最大值设置为500,并且对于每次下载,您仍将以与现在相同的方式将100添加到总数中,但是在每次下载开始时总数不会重置