我想要一个进度条,但是得到了一个旋转的进度对话框。

9

我正在使用一个公共的AsynTask来下载数据,并且我试图显示一个进度条,以显示下载进度。我认为我的代码是正确的,但我得到的只是一个旋转的进度对话框。我错过了什么吗?为什么进度条没有出现?以下是代码。 感谢任何指针。

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();
    }
}
4个回答

8

你可能忘记设置 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;
}

谢谢 - 这个可行。唯一需要更改的是使用单参数构造函数并设置进度样式。 - Samik R
1
谢谢,这也帮助了我。我的错误在于我调用了 ProgressDialog.show(...); 并在此之后设置了所有其他参数。 - Glogo

4
看起来您正在使用ProgressDialog的两个参数构造函数,文档建议第一个参数为Context,第二个参数为主题id。 http://developer.android.com/reference/android/app/ProgressDialog.html#ProgressDialog(android.content.Context, int)
因此,虽然您认为您正在将 ProgressStyle 设置为 STYLE_HORIZONTAL,但实际上您并没有这样做,而是将主题 id 设置为可能不是有效主题 id 的值。
我建议使用一个参数构造函数,该构造函数接受一个 Context,然后像Pentium10建议一样调用 _progressDia.setProgressStyle(ProgressStyle.STYLE_HORIZONTAL);

你说得对 - 我原以为使用两个参数的构造函数可以将样式设置为水平,但事实并非如此。我也不确定那是什么......无论如何,现在一切都正常了。谢谢。 - Samik R

2

在xml文件中,您还可以使用以下标记来指定:

style="@android:style/Widget.ProgressBar.Horizontal"


1
这个太赞了。GUI编辑器在创建时标记为水平,但实际上并没有创建成水平进度条(这是Eclipse ADK中的一个错误)。 - Lassi Kinnunen

-1

在您的Android项目当前意图XML文件中输入进度条条目,作为进度条

保存后还要检查R.java文件中进度条的ID

每当下载开始时,应调用该意图

例如:

startActivity(new Intent(this, Progress.class));


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