1

我使用 doInBackGround 和 AsyncTask 方法显示进度如下:

class UploadFile extends AsyncTask<String, String, String> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        showDialog(DIALOG_DOWNLOAD_PROGRESS);
    }

    @Override
    protected String doInBackground(String... aurl) {
        upload(ActionUrl, uploadFile, savepath, newName);
        return null;
    }

    protected void onProgressUpdate(String... progress) {
        mProgressDialog.setProgress(Integer.parseInt(progress[0]));
    }

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

upload(ActionUrl, uploadFile, savepath, newName);方法是这样的。下面的代码:

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
        case DIALOG_DOWNLOAD_PROGRESS: //we set this to 0
            mProgressDialog = new ProgressDialog(this);
            mProgressDialog.setMessage("Downloading file...");
            mProgressDialog.setIndeterminate(false);
            mProgressDialog.setMax(100);
            mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            mProgressDialog.setCancelable(true);
            mProgressDialog.show();
            return mProgressDialog;
        default:
            return null;
    }
}

并在下面调用:

private ProgressDialog mProgressDialog;
public static final int DIALOG_DOWNLOAD_PROGRESS = 0;
new UploadFile().execute("test");

但是进度对话框总是显示 0%,并且永远不会更新。如何修改以更新它?

4

2 回答 2

1

你必须调用publishProgress(...)你的doInBackground(...)方法。这就是onProgressUpdate(...)被调用的原因。onProgressUpdate(...)不是神奇地调用的。

它被设计为多用途,您有责任publishProgress(...)使用您希望它发布的任何“进度”数据来触发它。它可以是数字,例如1010%,也可以是字符串,例如First file downloaded....

AsyncTask课程不知道您要发布什么或何时发布 - 这就是调用publishProgress(...)fromdoInBackground(...)的目的。

于 2012-01-19T02:50:33.820 回答
1

您将需要创建第二个线程来跟踪进度并将其报告给此活动。这是一个链接,其中包含如何完成此操作的示例:http: //developer.android.com/guide/topics/ui/对话框.html

在此链接中查找“带有第二个线程的示例 ProgressDialog”

于 2012-01-19T02:15:19.023 回答