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);

    }
}
4

2 回答 2

0

1.始终建议保持 UI 在 UI 线程上工作,而 Non-UI 在 Non-UI 线程上工作,但从 Android 版本 HoneyComb 开始,它成为了一个规则。

2.所以在你使用的时候AsyncTask,让你从方法ProgressDialog 开始在Dedicated UI thread中展示onCreate()

3.然后解除 ProgressDialogfromonPostExecute()方法,这又在 Dedicated UI 线程上。

于 2012-08-08T11:07:15.237 回答
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");
      }
于 2012-08-08T11:07:35.737 回答