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