AsyncTask中的ProgressDialog setProgress和setMessage不起作用

时间:2015-03-11 09:57:51

标签: android android-asynctask android-progressbar

我有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);

如果我把它放在方法的中间会发生一些异常,但是在第一次它工作正常!

出了什么问题?

3 个答案:

答案 0 :(得分:13)

您的问题与setIndeterminate(true);有关如果您想要更新进度(请查看Android setProgress doc),请将其设置为false,不要忘记也使用{ {1}}将进度最大值设置为所需的值。

正如Laurent所说,你只能在UI线程上改变进度,所以你必须在setMax()中而不是在doInBackground中进行

答案 1 :(得分:2)

您必须更新UI线程内的进度值,以便在AsyncTasK的onProgressUpdate方法中

答案 2 :(得分: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
            }
        }