安卓中的文件下载进度条

3
如何在Android进度条中显示正在下载的文件剩余KB数。例如,剩余12kb / 120kb,然后是97kb / 120kb等等。
我们可以像图片中显示的那样拥有这个进度对话框。
5个回答

2
class DownloadFileAsync extends AsyncTask<String, String, String> {
        private ProgressDialog mProgressDialog;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            mProgressDialog = new ProgressDialog(UrlTestActivity.this);
            mProgressDialog.setMessage("Downloading file..");
            mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            mProgressDialog.setCancelable(false);
            mProgressDialog.show();
        }

        @Override
        protected String doInBackground(String... aurl) {
            int count;
            try {

                for (int i = 0; i < 3; i++) {
                    URL url = new URL("http://nodeload.github.com/nexes/Android-File-Manager/zipball/master");
                    URLConnection conexion = url.openConnection();
                    conexion.connect();
                    int lenghtOfFile = conexion.getContentLength();
                    InputStream is = url.openStream();
                    File testDirectory = new File(Environment.getExternalStorageDirectory() + "/Folder");
                    if (!testDirectory.exists()) {
                        testDirectory.mkdir();
                    }
                    FileOutputStream fos = new FileOutputStream(testDirectory+ "/"+(i+100)+".zip");
                    byte data[] = new byte[1024];
                    long total = 0;
                    int progress = 0;
                    while ((count = is.read(data)) != -1) {
                        total += count;
                        int progress_temp = (int) total * 100 / lenghtOfFile;
                        publishProgress(""+ progress_temp);
                        if (progress_temp % 10 == 0 && progress != progress_temp) {
                            progress = progress_temp;
                        }
                        fos.write(data, 0, count);
                    }
                    is.close();
                    fos.close();
                }
            } catch (Exception e) {}
            return null;

        }
        protected void onProgressUpdate(String... progress) {
             Log.d("ANDRO_ASYNC",progress[0]);
             mProgressDialog.setProgress(Integer.parseInt(progress[0]));
        }

        @Override
        protected void onPostExecute(String unused) {
            dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
        }
    }

1

你所描述的最好的方法是使用AsyncTask执行下载。在onProgressUpdate方法中,您可以更新ProgressDialog以指示用户完成的百分比。它将如下所示:

ProgressDialog Screenshot


1
progressDialog.setMax(fileLength/1000);

publishProgress(String.valueOf(total /1000));

以下代码仅适用于API 11及以上版本

progressDialog. setProgressNumberFormat ("%1d kb of %2d kb");


0

您可以使用进度对话框,如文档中所讨论的那样。或者(也许更加优雅),您可以在活动的标题栏中使用进度指示器。在调用 setContentView 之前,在您的活动中添加以下行:

requestWindowFeature(Window.FEATURE_PROGRESS);

然后通过调用setProgress(int),您可以指示进度。当进度达到10000时,标题栏中的进度指示器会消失。请注意,如果您在非UI线程中确定进度,则应使用Handler调用setProgress


如何计算文件的剩余KB? - Jitesh
1
通常服务器响应包含一个content-length http头。如果没有,那么您就无法知道总大小,需要使用不确定进度(只是一个旋转的轮子,没有进度指示器)。为此,您需要使用requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); - Ted Hopp
@Ted-Hopp 是的,我有 content-length 的 HTTP 头部...但是我需要在表单中显示什么,就像我附加的图片中显示的那样,118kb 中的 52kb - Jitesh
我这样做的方法是设置一个循环,每次只读取下载的一小部分(比如4KB),更新下载进度,并重复此过程,直到下载完成(或用户取消下载)。这样你就知道已经到达了多少量(在“小量”分辨率内)。 - Ted Hopp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接