asyncTask 中的 ProgressDialog setProgress 和 setMessage 不起作用

ProgressDialog setProgress and setMessage inside asyncTask don't work

我有一个 asynktask,它显示一个 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);
}

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

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

如果我把它放在方法中间会出现一些异常,但在第一个它工作正常!

怎么了?

这样做

@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
            }
        }

您必须更新 UI 线程内的进度值,因此在您的 AsyncTasK

的 onProgressUpdate 方法中

你的问题与setIndeterminate(true);有关,如果你想更新进度,你应该将它设置为false(看看Android setProgress doc),别忘了也使用 setMax() 将进度最大值设置为所需值。

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

中进行