Java 进度对话框不会被取消

Java 进度对话框不会被取消,java,android,xml-parsing,android-asynctask,android-progressbar,Java,Android,Xml Parsing,Android Asynctask,Android Progressbar,我想要一个进度对话框,上面写着“请稍候”,而我的代码下载并解析一个xml文件,但是进度对话框没有运行,它不知怎么被卡住了。 我使用的是AsyncTask,xml文件的下载和解析都是在后台线程中完成的,如果我删除“进度”对话框,代码会正常工作,但在这种情况下,您必须等待大约4秒,才能单击我的按钮来动态创建UI private class ParseXML extends AsyncTask<Integer, Integer, Document>{ private Context co

我想要一个进度对话框,上面写着“请稍候”,而我的代码下载并解析一个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);

    }
}
私有类ParseXML扩展异步任务{
私人语境;
私人活动;
私营部门;
公共解析XML(活动){
这个。活动=活动;
上下文=活动;
pd=新进度对话框(上下文);
}
公共无效onPreExecute(){
super.onPreExecute();
/*ProgressDialog pd=ProgressDialog.show(XML_PARSER.this,“,”请稍候“)*/
}
@凌驾
受保护文档doInBackground(整数…参数){
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
文档dom1=null;
试一试{
//InputStream is=getResources().openRawResource(R.raw.options);
URL requestURL=新URL(“我的URL”);
URLConnection connection=requestURL.openConnection();
is=connection.getInputStream();
DocumentBuilder db=dbf.newDocumentBuilder();
dom1=db.parse(is);
Log.i(标记“解析完成”);
}
捕获(ParserConfiguration异常pce){
pce.printStackTrace();
}
捕获(SAXSE异常){
se.printStackTrace();
}
捕获(ioe异常ioe){
ioe.printStackTrace();
}
解析文档(dom1);
返回null;
}           
@凌驾
PostExecute上的公共作废(文档d){
if(pd!=null&&pd.isShowing()){
pd.解散();
}
super.onPostExecute(d);
}
}

1.始终建议用户界面在用户界面线程上工作,非用户界面在非用户界面线程上工作,但从Android版本开始,这已成为一条规则

2.因此,当您使用
AsyncTask
时,让您
ProgressDialog
onCreate()
方法开始在专用UI线程中显示


3.然后
onPostExecute()
方法中关闭
ProgressDialog
,该方法再次位于专用UI线程上。

您在这里犯了错误

 public void onPreExecute(){
  super.onPreExecute();
 /*  ProgressDialog pd=ProgressDialog.show(XML_PARSER.this,"","Please Wait");*/
  }
您正在声明一个局部变量

当控制即将来临时

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

你有什么问题?你到底想要什么?你想取消进度对话框吗?@nick-找到我的解决方案了。顺便说一句,我需要关闭postExecute()中的进度对话框。现在它开始工作了。好的,但是我从哪里开始我的进度对话框有关系吗,因为它正在启动但没有关闭。这就是我要说的,从onCreate开始,并将dismise()放在onPostExecute()方法中,这将导致对话框终止…是的..如果对话框正在启动…则无需在onPostExecute()中检查null等哦,明白了。谢谢你的回复。哦,明白了,初学者错了。让我试试。对不起,马克迟到了,我有一些工作,这就是我迟到的原因,我知道如何接受:P