2010-07-24 40 views
9

我使用一个公共的AsynTask来下载数据,我试图显示一个进度条,它会显示下载进度。我认为我的代码是正确的,但我得到的是一个微调进度对话框。我错过了什么吗?为什么不显示进度条?这是代码。 谢谢你的指点。我想要一个进度条,但得到一个微调progressdialog

public class FileDownloader extends AsyncTask<String, Integer, Void> 
{ 
private Context _appContext; 
private HttpURLConnection _urlConn; 
private ProgressDialog _progressDia = null; 
private DialogInterface.OnCancelListener _progDiaCancelListener = new DialogInterface.OnCancelListener() 
{ 
    /** 
    * When the progress dialog is canceled, stop the GET request. 
    */ 
    public void onCancel(DialogInterface dialog) 
    { 
     FileDownloader.this.cancel(true); 
    } 
}; 

/** 
* Constructor. 
* @param appContext 
*/ 
public FileDownloader(Context appContext) 
{ 
    _appContext = appContext; 
    _progressDia = new ProgressDialog(_appContext, ProgressDialog.STYLE_HORIZONTAL); 
    _progressDia.setMax(100); 
    _progressDia.setTitle(_appContext.getString(R.string.diaHeader1)); 
    _progressDia.setMessage(_appContext.getString(R.string.diaBody1)); 
    _progressDia.setCancelable(true); 
    _progressDia.setIndeterminate(false); 
    _progressDia.setOnCancelListener(_progDiaCancelListener); 
} 

// Runs on the UI thread 
@Override 
protected void onPreExecute() 
{ 
     _progressDia.setProgress(0); 
     _progressDia.show();       
} 

@Override 
protected Void doInBackground(String... args) 
{ 
    String dloadURL = args[0], 
      saveLoc = args[1]; 
      ... 
      ... 
     while((len = input.read(buf)) > 0) 
     { 
      output.write(buf, 0, len); 
      total += len; 
      publishProgress((int)total * 100/lenghtOfFile); 
     } 
      ... 
      ... 
    } 
    catch(SocketTimeoutException ex) 
    { 
    } 
    finally 
    { 
     ... 
} 

// This is executed on main UI thread. 
@Override 
protected void onProgressUpdate(Integer... values) 
{ 
    _progressDia.setProgress(values[0]); 
} 

@Override 
protected void onCancelled() 
{ 
     ... 
} 

// This is executed on main UI thread. 
@Override 
protected void onPostExecute(Void result) 
{ 
     removeProgressDialog(); 
     ... 
} 

    /** 
    * Remove the message dialog, if still showing. 
    */ 
    private void removeProgressDialog() 
    { 
     if(_progressDia != null && _progressDia.isShowing()) 
     _progressDia.dismiss(); 
    } 
} 

回答

9

也许你忘记设置dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

请参见本示例代码的作品我:

ProgressDialog dialog; 

@Override 
protected void onPreExecute() { 
    dialog = new ProgressDialog(this); 
    dialog.setMessage("Matching progress"); 
    dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
    dialog.setMax(100); 
    dialog.setCancelable(false); 
    dialog.show(); 
} 

/* 
* (non-Javadoc) 
* @see android.os.AsyncTask#doInBackground(Params[]) 
*/ 
@Override 
protected Void doInBackground(Void... params) { 

    return null; 

} 

protected void onPostExecute(Void result) { 
    dialog.hide(); 
    dialog = null; 
} 
+0

感谢 - 这工作。只有我必须改变的是使用单个参数构造函数并设置进度风格。 – 2010-07-25 04:52:12

+1

谢谢,也帮助了我。我的错误是我正在调用'ProgressDialog.show(...);'然后设置所有其他参数 – Glogo 2015-03-10 10:07:25

-1

在你的Android项目目前的意图XML文件做进度条 进入进度条

也R.java文件保存 您的进度条的ID后检查

意图应该在下载开始时调用

like

startA ctivity(new Intent(this,Progress.class));

4

看来,您正在使用这两个参数的构造函数用于ProgressDialog,该文档建议是上下文(第一个arg)和主题ID(第二个arg)。

http://developer.android.com/reference/android/app/ProgressDialog.html#ProgressDialog(android.content.Context,INT)

所以,当你以为你是设置ProgressStyle到STYLE_HORIZONTAL,你不这样做,在所有的,你要设置主题标识的东西,很可能不是一个有效的主题ID。

我会建议使用一个上下文中的arg构造函数,然后按照Pentium10建议的方式执行并调用_progressDia.setProgressStyle(ProgressStyle.STYLE_HORIZONTAL);

+0

你是对的 - 我认为我使用两个参数构造函数将样式设置为横向,但这是不是这样。不知道那是什么....无论如何,事情现在正在起作用。谢谢。 – 2010-07-25 04:53:35

2

你也可以给它在XML文件

风格=此标记 “@安卓风格/ Widget.ProgressBar.Horizo​​ntal”

+1

这一百万ups。 gui编辑器在创建它时将其标记为横向,但不会将其创建为水平进度条(这是eclipse adk中的一个错误) – 2013-04-17 11:46:30

相关问题