【问题标题】:download files in a single progress bar在单个进度条中下载文件
【发布时间】:2013-01-01 01:08:01
【问题描述】:

我有一个由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();
                 }


            }

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

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

【问题讨论】:

    标签: java android android-asynctask progress-bar


    【解决方案1】:

    在您的doInBackground() 方法中,只需在AsyncTask 的单次执行中循环您需要下载的文件列表。您可能还应该利用 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,但总数不会在每次下载开始时重置.

    【讨论】:

    • @Devunwinred 非常感谢您的帮助,但问题是这样做会有与下载文件一样多的进度条。我只想为所有文件显示一个进度条。我想我需要在调用发布进度之前计算所有下载文件的总长度文件?
    • 所以您的问题不是多个进度条,而是每次下载都会重置进度条,并且您希望它显示所有文件的整体操作进度。我已经编辑了一些想法。
    • 非常感谢。你很有帮助。现在效果很好
    【解决方案2】:

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

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

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

    【讨论】:

    • 这无法完成。任何AsyncTask 实例只能运行一次。再次调用execute() 会抛出异常。
    • 传递您要下载的文件的所有 url。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-23
    • 2022-10-15
    • 1970-01-01
    相关资源
    最近更新 更多