我想要一个进度对话框,说“请等待”,而我的代码下载并解析一个xml文件,但进度对话框没有进行,它以某种方式卡住了。 我正在使用AsyncTask,下载xml文件并解析在后台线程中完成,如果我删除了进度对话框,代码正常工作,但在这种情况下你必须等待大约4秒才能点击动态创建UI的按钮。
private class ParseXML extends AsyncTask<Integer, Integer, Document>{
private Context context;
private Activity activity;
private ProgressDialog pd;
public ParseXML(Activity activity) {
this.activity = activity;
context = activity;
pd = new ProgressDialog(context);
}
public void onPreExecute(){
super.onPreExecute();
/* ProgressDialog pd=ProgressDialog.show(XML_PARSER.this,"","Please Wait");*/
}
@Override
protected Document doInBackground(Integer... params) {
DocumentBuilderFactory dbf= DocumentBuilderFactory.newInstance();
Document dom1=null;
try {
//InputStream is=getResources().openRawResource(R.raw.options);
URL requestURL = new URL("my url");
URLConnection connection = requestURL.openConnection();
is = connection.getInputStream();
DocumentBuilder db = dbf.newDocumentBuilder();
dom1=db.parse(is);
Log.i(TAG,"parsing done");
}
catch(ParserConfigurationException pce){
pce.printStackTrace();
}
catch(SAXException se){
se.printStackTrace();
}
catch(IOException ioe){
ioe.printStackTrace();
}
ParseDocument(dom1);
return null;
}
@Override
public void onPostExecute(Document d){
if(pd!=null && pd.isShowing()){
pd.dismiss();
}
super.onPostExecute(d);
}
}
答案 0 :(得分:0)
1。始终建议将UI保持在UI线程上,非UI在非UI线程上工作,但是从Android版HoneyComb开始它就成了规则。
2。当您使用AsyncTask
时,让ProgressDialog
从{{1}开始在专用UI线程中显示方法。
3。然后从onCreate()
方法中解除 ProgressDialog
,该方法再次位于专用UI线程上。
答案 1 :(得分:0)
你这里犯了错误
public void onPreExecute(){
super.onPreExecute();
/* ProgressDialog pd=ProgressDialog.show(XML_PARSER.this,"","Please Wait");*/
}
您要声明ProgressDialog pd
本地变量
当控制权来临时
@Override
public void onPostExecute(Document d){
if(pd!=null && pd.isShowing()){
pd.dismiss();
}
super.onPostExecute(d);
}
pd在此处为null,因为您尚未初始化全局pd变量。这就是警报对话框没有被解雇的原因。
使这项工作只需在onPreExecute
public void onPreExecute(){
super.onPreExecute();
pd=ProgressDialog.show(XML_PARSER.this,"","Please Wait");
}