【问题标题】:ProgressDialog does not appear in method onProgressUpdateProgressDialog 没有出现在方法 onProgressUpdate 中
【发布时间】:2026-01-10 17:15:01
【问题描述】:

在一个 Asyntask 中,我在 Asyntask 的全局变量中实例化一个进度对话框:

ProgressDialog progressDialog;

然后,在 DoInBackGround 中,我调用了“publishProgress”,因此调用了 onProgressUpdate。 在那里,在 onProgressUpdate 中,我有以下代码:

this.progressDialog=new ProgressDialog(mActivity);
                this.progressDialog.setCancelable(true);
                this.progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
                this.progressDialog.setTitle("Iniciando la comunicación");
                this.progressDialog.show();

我不知道为什么,progressDialog 从未显示。我曾尝试在相同的上下文中使用 Toast,并且效果很好。虽然progressDialog没有。

---------更新--------------

最后,我用通知解决了这个问题。

【问题讨论】:

  • 我已经试过了,我不行
  • 你检查我的答案了吗?
  • @PhanVănLinh 我实现了你的答案,但是没有成功。
  • 你能发布你的更新代码吗
  • @PhanVănLinh 我终于通过通知而不是 ProgressDialog 做到了。

标签: android android-asynctask progressdialog


【解决方案1】:

像这样组织你的AsyncTask

private class YourTask extends AsyncTask<String, String, String> {
    ProgressDialog progressDialog;
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        ...
        // show the dialog
        this.progressDialog=new ProgressDialog(mActivity);
            this.progressDialog.setCancelable(true);
            this.progressDialog.setProgressStyle(ProgressDialog. STYLE_HORIZONTAL);
           //this.progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
            this.progressDialog.setTitle("Iniciando la comunicación");
            this.progressDialog.show();
    }

    @Override
    protected String doInBackground(String... urls) {

        ...
        publishProgress("" + progress);
        ...
    }

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

    @Override
    protected void onPostExecute(String result) {
        // dismiss the dialog           
        progressDialog.dismiss();
        ...
    }
}

您还想在AsyncTask 运行时公开进度,因此您需要STYLE_HORIZONTAL ProgressBar 而不是STYLE_SPINNER ProgressBar

希望有帮助

【讨论】:

    【解决方案2】:

    两年前我就看到了这个问题。主 UI 线程交互时有一些不可预测的行为。 我找到的解决方案是使用Thread 而不是AsyncTack

    一个简单的例子:

    new Thread(new Runnable() {
                        public void run() {
    
    //background code to calculate
    //for example
    for(int i = 0; i < 100000000L; i++){
    myHugeCalc(i);
    final int prog = i;
    runOnUiThread(new Runnable() {
                        public void run() {
    
                            pbtext.setText("My progress: " + prog);
    
                        }
                    });
    }
    
    }).start();
    

    【讨论】:

    • 可以异步显示下载进度吗?
    • @NoorHossain 是的
    • 我不知道你的问题
    【解决方案3】:

    还有另一种方法可以做到这一点... 当您从班级调用此同步过程时,开始在那里显示进度对话框,然后onPostExecute 取消它。 它会做你的工作... 但最好的做法是在onPreExecute

    【讨论】: