0

我有一个由 a 管理的进度条,AsyncTask它从 Internet 下载一些文件。

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();
                 }


            }

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

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

4

2 回答 2

0

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

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

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

于 2013-01-01T04:12:31.227 回答
0

在您的doInBackground()方法中,只需在AsyncTask. 您可能还应该利用 varargs 的性质execute()来传递您需要下载的 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 添加到总数中,但总数不会在每次下载开始时重置.

于 2013-01-01T04:26:49.597 回答