如何为下载提供进度条?

时间:2011-03-14 08:46:41

标签: android asynchronous progress-bar android-asynctask android-progressbar

在我的应用程序中,我正在下载视频文件。我想显示下载的进度条。

如何通过AsyncTask Concept实现?

谢谢,

尼基

2 个答案:

答案 0 :(得分:6)

使用AsyncTask的onProgressUpdate方法。

如果您知道文件的大小,可以在onPreExecute中设置最大值:

protected void onPreExecute() {
  ProgressDialog myDialog = new ProgressDialog(context);
  myDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
  myDialog.setMax(maxValue);
  myDialog.show();
}

编辑:添加myDialog.show();

有几种方法可以通过增加金额或将进度设置为特定值来更新进度:

@Override
protected void onProgressUpdate(Integer... progress) {
  myDialog.incrementProgressBy(progress[0]);

  // or
  // myDialog.setProgress(progress[0]);

}

然后在onDoInBackground():

@Override
protected void doInBackGround() {
  // your code
  publishProgress(1);
}

在布局中带有进度条的编辑示例:

在您的布局文件中,添加像这样的进度条

<ProgressBar
    android:id="@+id/progressbar"
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    style="?android:attr/progressBarStyleHorizontal"
    android:visibility="gone"
    />

在你的asynctask:

protected void onPreExecute() {
  ProgressBar myProgress = findViewById(R.id.progressbar);
  myProgress.setMax(maxValue);
  myProgress.setVisibility(View.VISIBLE);
}

protected void onProgressUpdate(Integer... progress) {
  myProgress.setProgress(progress[0]);
}

答案 1 :(得分:0)

首先,您必须计算下载timi,然后按时间限制实施进度条。在这里我附上了进度条的示例程序

new Thread(new Runnable() {
         public void run() {
             while (mProgressStatus < 100) {
                 mProgressStatus = doWork();

                 // Update the progress bar
                 mHandler.post(new Runnable() {
                     public void run() {
                         mProgress.setProgress(mProgressStatus);
                     }
                 });

这是用于计算下载文件的时间长度的代码

//once the connection has been opened              

List values = urlConnection.getHeaderFields().get("content-Length")
if (values != null && !values.isEmpty()) {

// getHeaderFields() returns a Map with key=(String) header 
// name, value = List of String values for that header field. 
// just use the first value here.
String sLength = (String) values.get(0);

if (sLength != null) {
   //parse the length into an integer...
   }