在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没有。
--------- UPDATE --------------
最后,我已经使用通知来解决这个问题。
答案 0 :(得分:3)
像这样组织你的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
希望这个帮助
答案 1 :(得分:0)
两年前我看到了这个问题。主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();
答案 2 :(得分:0)
还有另一种方法可以做到这一点......
当您从班级调用此同步过程时,请开始在其中显示进度对话框,onPostExecute
取消它。
它会做你的工作......
但最佳做法是在onPreExecute