0

我想要一个进度对话框说“请稍候”,而我的代码下载和分析一个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

什么你的问题的一些变化?你想要什么?你想关闭进度对话框吗? – 2012-08-08 11:06:06

+0

@ nick-得到了我的解决方案。顺便说一句,我需要关闭我的postExecute()进度对话框。现在它正在工作。 – 2012-08-08 11:33:31

回答

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为空在这里,你还没有初始化全球pd变量。这就是为什么警报对话不会被解雇。

,使这项工作刚刚作出onPreExecute

public void onPreExecute(){ 
     super.onPreExecute(); 
     pd=ProgressDialog.show(XML_PARSER.this,"","Please Wait"); 
     } 
+0

哦,明白了,初学者错误。让我尝试 。 – 2012-08-08 11:11:59

+0

k好不要忘记标记我的答案,如果它的工作。 – Akram 2012-08-08 11:12:40

+0

它确实在工作。 – 2012-08-08 11:13:42

0

它总是建议保持对UI线程的UI工作,并在非UI线程非UI的工作,但是从Android版本蜂巢它成为一个规则。

2.所以,当你使用AsyncTask,让你ProgressDialog开始显示在专用UI线程,从onCreate()方法。

3.然后onPostExecute()方法,而这又是专用UI线程上关闭该ProgressDialog

+0

好的,但是我会在哪里开始进度对话框? ,因为它正在启动,但并未关闭。 – 2012-08-08 11:09:04

+0

那就是我所说的,从onCreate开始它,并且将on()方法中的dismiss()放在onPostExecute()方法中,这将导致Dialog的终止...并且如果进度对话框正在启动.. 。onPostExecute() – 2012-08-08 11:20:52

+0

没有必要检查null等等,明白了。感谢您的回复 。 – 2012-08-08 11:31:51