通过AsyncTask更新的双进度条

时间:2014-02-27 10:26:40

标签: android android-asynctask android-progressbar

我正在开发一个应用程序,用于下载文件并显示2个进度条,第一个用于当前下载文件,第二个用于根据文件数进行总进度。

我在我的应用中使用DoubleProgressBar库:

我成功更新了第一个ProgressBar,但坚持使用第二个。

这是我的AsyncTask类的代码:

private DoubleProgressDialog pDialog;

    class DownloadFileFromURL extends AsyncTask<String, Integer, String> {
        Context mContext;

        public DownloadFileFromURL(Context ctx) {
            // TODO Auto-generated constructor stub
            this.mContext = ctx;
        }

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

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

            InputStream input = null;
            OutputStream output = null;
            HttpURLConnection connection = null;

            try {
                URL url = new URL(f_url[0]);
                connection = (HttpURLConnection) url.openConnection();
                connection.connect();
                // getting file length
                int fileLength = connection.getContentLength();
                for (int i = 0; i <= ArrayOfFiles.length; i++){
                File f = new File(Environment.getExternalStorageDirectory() + "/Folder/", ArrayOfFiles[i]);

                // input stream to read file - with 8k buffer
                input = new BufferedInputStream(url.openStream(), 8192);
                // Output stream to write file
                output = new FileOutputStream(f); 

                byte data[] = new byte[8192];

                long total = 0;
                int count;
                int EntireProgress = 0;
                while ((count = input.read(data)) != -1) {
                    // allow canceling with back button
                    if (isCancelled()) {
                        input.close();
                        return null;
                    }
                    total += count;
                    // publishing the progress....
                    if (fileLength > 0) // only if total length is known
                    publishProgress((int)(total * 100 / fileLength));
                    output.write(data, 0, count);

                        /*Here is my trouble, the 2nd ProgressBar is updating as the same of the first one, I need the 2nd one to update itself slowly till all files get downloaded*/
                    int CurrentProgress = pDialog.getProgress();
                    pDialog.setSecondaryProgress(CurrentProgress );
                    publishProgress(CurrentProgress );

                }

            } catch (Exception e) {
                return e.toString();
            } finally {
                try {
                    if (output != null)
                        output.close();
                    if (input != null)
                        input.close();
            }
                } catch (IOException ignored) {
                }

                if (connection != null)
                    connection.disconnect();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            // dismiss the dialog after the file was downloaded
            dismissDialog(CUSTOM_PROGRESS_DIALOG);

            if (result != null)
                Toast.makeText(mContext,"Download error: " + result, Toast.LENGTH_LONG).show();
            else
                Toast.makeText(mContext,"File downloaded", Toast.LENGTH_SHORT).show();  
        }

        @Override
        protected void onProgressUpdate(Integer... progress) {
            super.onProgressUpdate(progress);
            // if we get here, length is known, now set indeterminate to false
            pDialog.setIndeterminate(false);
            pDialog.setMax(100);
            pDialog.setProgress(progress[0]);
        }

    }

我也在我的活动类中使用了这个方法:

    @Override
        protected Dialog onCreateDialog(int id) {
            switch (id) {
            case CUSTOM_PROGRESS_DIALOG:
                pDialog = new DoubleProgressDialog(NetworkActivity.this);
                pDialog.setMessage("Downloading file. Please wait...");
                pDialog.setMax(100);
                pDialog.setIndeterminate(true);
                pDialog.setCancelable(false);
                pDialog.setButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        dialogInterface.cancel();
                    }
                });
                pDialog.show();
                return pDialog;
            default:
                return null;
            }
        }

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

第一部分是将pDialog.setSecondaryProgress移至onProgressUpdate(Integer... progress)方法 您还要将每个下载任务的辅助进度重置为CurrentProgress,并将其设置为pDialog.getProgress();。因此,下载完成后将始终重置第二个进度。

编辑:

// publishing the progress....
if (fileLength > 0) // only if total length is known
    publishProgress((int)(total * 100 / fileLength), pDialog.getSecondaryProgress());

(...)

int CurrentProgress = pDialog.getProgress();

// do not update secondary progress here
// pDialog.setSecondaryProgress(CurrentProgress );
int secondaryProgress = (CurrentProgress + 100 * i)/ArrayOfFiles.length;
publishProgress(CurrentProgress, secondaryProgress);

onProgressUpdate

@Override
protected void onProgressUpdate(Integer... progress) {
   super.onProgressUpdate(progress);

   (...)       

   pDialog.setProgress(progress[0]);
   pDialog.setSecondaryProgress(progress[1]);

}

答案 1 :(得分:1)

如果您没有将DownloadFileFromUrl设置在主要课程之外,我建议使用此类

int CurrentProgress = pDialog.getProgress();
int secondaryProgress = (CurrentProgress + 100 * id_treated_file)/number_of_files;
// id_treated_file - 0, 1, 2, ... , number_of_files - 1
pDialog.setSecondaryProgress(CurrentProgress);
// secondaryProgress will be progress[1] in your onProgressUpdate method
publishProgress(CurrentProgress, secondaryProgress);

您的onProgressUpdate方法应如下所示:

@Override
protected void onProgressUpdate(Integer... progress) {
    super.onProgressUpdate(progress);
    // if we get here, length is known, now set indeterminate to false
    pDialog.setIndeterminate(false);
    pDialog.setMax(100);
    pDialog.setProgress(progress[0]);
    pDialog.setSecondaryProgress(progress[1]);
}

修改
或者你可以尝试

 pDialog.setSecondaryProgress((progress[0] + 100 * id_treated_file)/number_of_files);