Android ProgressDialog未出现在方法onProgressUpdate中

Android ProgressDialog未出现在方法onProgressUpdate中,android,android-asynctask,progressdialog,Android,Android Asynctask,Progressdialog,在Asyntask中,我在Asyntask的全局变量中实例化了一个进度对话框: ProgressDialog progressDialog; 然后,在DoInBackGround中,我调用“publishProgress”,因此调用ProgressUpdate in。 在onProgressUpdate中,我有以下代码: this.progressDialog=new ProgressDialog(mActivity); this.progressDialog.

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

ProgressDialog progressDialog;
然后,在DoInBackGround中,我调用“publishProgress”,因此调用ProgressUpdate in。 在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,效果很好。虽然不是

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


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

我两年前就看到了这个问题。在主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();
new线程(new Runnable()){
公开募捐{
//要计算的背景代码
//比如说
对于(int i=0;i<100000000 l;i++){
myHugeCalc(i);
最终int prog=i;
runOnUiThread(新的Runnable(){
公开募捐{
setText(“我的进度:+prog”);
}
});
}
}).start();

我两年前就看到了这个问题。在主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();
new线程(new Runnable()){
公开募捐{
//要计算的背景代码
//比如说
对于(int i=0;i<100000000 l;i++){
myHugeCalc(i);
最终int prog=i;
runOnUiThread(新的Runnable(){
公开募捐{
setText(“我的进度:+prog”);
}
});
}
}).start();

还有另一种方法。。。 当您从类中调用此同步进程时,开始在那里显示进度对话框,然后
onPostExecute
取消它。 它会做你的工作。。。
但最好的做法是在执行时使用
onPreExecute

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

中这样组织您的
异步任务

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();
        ...
    }
}
YourTask扩展AsyncTask的私有类{
进行对话进行对话;
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
...
//显示对话框
this.progressDialog=newprogressDialog(mActivity);
this.progressDialog.setCancelable(true);
this.progressDialog.setProgressStyle(progressDialog.STYLE_水平);
//this.progressDialog.setProgressStyle(progressDialog.STYLE\u微调器);
this.progressDialog.setTitle(“Iniciando la comunicación”);
这个.progressDialog.show();
}
@凌驾
受保护的字符串doInBackground(字符串…URL){
...
出版进度(“+”进度);
...
}
受保护的void onProgressUpdate(字符串…进度){
progressDialog.setProgress(Integer.parseInt(progress[0]));
}
@凌驾
受保护的void onPostExecute(字符串结果){
//关闭对话框
progressDialog.disclose();
...
}
}
您还希望在运行
AsyncTask
时公开进度,因此需要一个
STYLE\u水平
ProgressBar
而不是
STYLE\u微调器
ProgressBar


希望这有助于像这样组织您的
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();
        ...
    }
}
YourTask扩展AsyncTask的私有类{
进行对话进行对话;
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
...
//显示对话框
this.progressDialog=newprogressDialog(mActivity);
this.progressDialog.setCancelable(true);
this.progressDialog.setProgressStyle(progressDialog.STYLE_水平);
//this.progressDialog.setProgressStyle(progressDialog.STYLE\u微调器);
this.progressDialog.setTitle(“Iniciando la comunicación”);
这个.progressDialog.show();
}
@凌驾
受保护的字符串doInBackground(字符串…URL){
...
出版进度(“+”进度);
...
}
受保护的void onProgressUpdate(字符串…进度){
progressDialog.setProgress(Integer.parseInt(progress[0]));
}
@凌驾
受保护的void onPostExecute(字符串结果){
//关闭对话框
progressDialog.disclose();
...
}
}
您还希望在运行
AsyncTask
时公开进度,因此需要一个
STYLE\u水平
ProgressBar
而不是
STYLE\u微调器
ProgressBar



希望这个帮助

我已经试过了,我没用了。你检查过我的答案吗?@PhanVănLinh我实现了你的答案,但是没有用。你能发布你的更新吗code@PhanV我终于用通知而不是ProgressDialog成功了。我已经试过了,我不行。你检查过我的答案了吗?@PhanVănLinh I imp尽管如此,你的答案还是没有实现。你能发布你的更新吗code@PhanVănLinh我最终通过通知而不是ProgressDialog实现了它。它可以用于显示异步下载进度吗?@NoorHossain yesupvoted,有什么代码建议吗?我不知道你的问题,它可以用于显示异步下载进度吗?@NoorHossain是的,有代码建议吗?我不知道你的问题