android - 通过 AsyncTask 更新双进度条

标签 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]);
        }

    }

我在 Activity 课上也用过这个方法:

    @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;
            }
        }

有什么想法吗?

最佳答案

第一部分是将 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]);

}

关于android - 通过 AsyncTask 更新双进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22065630/

相关文章:

java - 根据从不同类别获得的值更新进度条

android - 如何动画进度通知图标

java - Java 编译器会优化对最终静态变量的方法调用吗?当它变成 dalvik 代码时会发生什么?

android - SQLite 问题从表中删除元素

android - 生成签名的 apk 失败并出现 build\app\intermediates\flutter\profile\libs.jar(系统找不到指定的路径)

Android 保留 AsyncTask 状态/进度

android - 应用发明家 : Asynchonous tasks?

android - 如何正确管理Android后台任务?

android - 如何在数字时钟中显示剩余时间?

android - 显示进度条直到下一个 Activity 开始