ProgressDialog在asyncTask中使用setProgress和setMessage无效。

7

我有一个asynctask,它会显示一个progressDialog,并在doInBackground方法中更新其值。代码如下:

@Override
protected void onPreExecute() {
    progress = new ProgressDialog(cont);
    progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    progress.setIndeterminate(true);
    progress.setTitle(cont.getResources().getString(R.string.pleaseWait));
    progress.setMessage(cont.getResources().getString(R.string.loadingImages));
    progress.show();
    super.onPreExecute();
}

@Override
protected String doInBackground(Void... arg0) {
    progress.setProgress(2);
    //do some work on the database and network
    progress.setProgress(25);
    //Do some extra work
    for(int i = 0; i < itemImagesList.size(); i++){
        publishProgress((int) ((i / (float) itemImagesList.size()) * 100));
        //Do somework
    }
}

@Override
protected void onProgressUpdate(Integer... prog) {
    progress.setProgress(prog[0]);
}

@Override
protected void onPostExecute(String result) {
    progress.dismiss();
    super.onPostExecute(result);
}

进度对话框的值根本没有改变!如果我尝试使用以下方式设置对话框消息:

progress.setMessage("At item "+i);

如果我把它放在方法的中间,会发生一些异常,但在第一个位置上它可以正常工作!这是怎么回事?

你只需要从doInBackground中删除progress.setProgress(2);和progress.setProgress(25);,就可以看到进度了。因为更新进度已经在UI上更新了。 - IshRoid
你试过这个吗? http://stackoverflow.com/questions/7970113/change-a-dialogs-message-while-using-asynctask?answertab=active#tab-top - Jejefcgb
3个回答

16

您的问题与 setIndeterminate(true); 相关。如果希望显示进度更新,请将其设置为 false (请参考Android setProgress文档),同时不要忘记使用setMax()将进度最大值设置为所需值。

正如Laurent所说,您只能在UI线程上更改进度,因此必须在 onProgressUpdate 中执行操作,而不是在 doInBackground 中执行。


2

您需要在UI线程内更新进度值,因此在AsyncTask的onProgressUpdate方法中进行更新。


1
像这样做
@Override
        protected String doInBackground(Void... arg0) {

                    getActivity ().runOnUiThread (new Runnable() {

                    @Override
                    public void run () {

                          progress.setProgress(2);
                                       //do some work on the database and network
                          progress.setProgress(25);

                    }
                });
            //Do some extra work
            for(int i = 0; i < itemImagesList.size(); i++){
                publishProgress((int) ((i / (float) itemImagesList.size()) * 100));
                //Do somework
            }
        }

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