进度对话框没有被解雇

时间:2012-08-08 11:01:30

标签: java android xml-parsing android-asynctask android-progressbar

我想要一个进度对话框,说“请等待”,而我的代码下载并解析一个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);

    }
}

2 个答案:

答案 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");
      }