Android-非阻塞对话框

Android-非阻塞对话框,android,Android,我对“进步的东西”很不满意。我有一个动态更改视图内容的应用程序(甚至视图本身也可能更改、消失、重新添加等等)。有些类负责主要活动的特定“风格”。其中一个下载一个XML文件,解析它(有一个特定的类来处理这个问题),并根据下载的内容向用户显示一些内容 无论如何,我的问题是我希望ProgressDialog是非阻塞的,这样用户就可以在等待时与其他应用程序的功能交互。我已经阅读了一些与这个问题相关的答案(比如),但到目前为止我还没有成功。使用“setUndeterminate(true)”(因为我想要旋

我对“进步的东西”很不满意。我有一个动态更改视图内容的应用程序(甚至视图本身也可能更改、消失、重新添加等等)。有些类负责主要活动的特定“风格”。其中一个下载一个XML文件,解析它(有一个特定的类来处理这个问题),并根据下载的内容向用户显示一些内容

无论如何,我的问题是我希望ProgressDialog是非阻塞的,这样用户就可以在等待时与其他应用程序的功能交互。我已经阅读了一些与这个问题相关的答案(比如),但到目前为止我还没有成功。使用“setUndeterminate(true)”(因为我想要旋转样式)更改为ProgressBar似乎不起作用(它根本不出现)

下面的私有类是我用来显示ProgressDialog的类。它的工作方式与我在下面发布的方式相同,但它阻止了UI交互=/

private class DownloadXmlTask extends AsyncTask<String, Void, Boolean> {
    private ProgressDialog mProgress;

    private int xmlType = 0;
    XmlHandler xmlHandler = null;

    DownloadXmlTask(){
        xmlHandler = new XmlHandler();
    }

    @Override 
    protected void onPreExecute(){

        mProgress = new ProgressDialog(context);
        mProgress.getWindow().setGravity(Gravity.CENTER);
        mProgress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        mProgress.setIndeterminate(true);
        mProgress.setMessage("Carregando...");
        mProgress.show();
    }

    @Override
    protected Boolean doInBackground(String... urls) {

        int count = urls.length;
        for(int i=0; i<count; i++){
            parseXml(urls[i]);
        } 
        return true;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        if(result == true){
            mProgress.dismiss();
            // Do something else

        }
    }

    /**
     * Parses the xml defined by the parameter's String
     * @param urlString The url's String
     */
    private void parseXml(String urlString){
        try {
            // Loads the url
            URL url = new URL(urlString);

            // Initializes the parser
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();

            // Sets the handler
            XMLReader xr = sp.getXMLReader();
            xr.setContentHandler(xmlHandler);

            // Parses
            xr.parse(new InputSource(url.openStream())); 

        }catch(Exception e) {
            // To something here
        }
    }
}
私有类下载XmlTask扩展AsyncTask{
私人进程;
私有int xmlType=0;
XmlHandler=null;
下载XmlTask(){
xmlHandler=新的xmlHandler();
}
@凌驾
受保护的void onPreExecute(){
mProgress=新建进度对话框(上下文);
mProgress.getWindow().setGravity(Gravity.CENTER);
mProgress.setProgressStyle(ProgressDialog.STYLE\u微调器);
mProgress.setUndeterminate(真);
设置消息(“Carregando…”);
mProgress.show();
}
@凌驾
受保护的布尔doInBackground(字符串…URL){
int count=url.length;

对于(int i=0;i您当前正在
onprexecute()
上显示
ProgressDialog
,这意味着您的UI线程将被对话框阻止。我建议您像ernazm提到的那样使用
ProgressBar
,并通过使用
onProgressUpdate()发布AsyncTask后台作业的进度
。您可以将
ProgressBar
像这样放在应用程序的标题栏上,因此

正如我所说,您需要
ProgressBar
。它对您不起作用的原因是
ProgressBar
是一个
视图
,与其他
视图一样,它必须添加到某个父视图中才能显示。请参阅一些注意xml布局。

但是你肯定需要
ProgressBar
而不是
ProgressDialog
。是的……我尝试使用
ProgressBar
而不是
ProgressDialog
,但正如我所说的那样,进度根本没有出现。我已经尝试了
ProgressBar的一些可能性e> …我一定是做错了什么。我尝试了以下方法:
mProgress=newprogressbar(上下文);mProgress.setIndeterminate(true);mProgress.setVisibility(View.VISIBLE);
,当作业完成时,我使用了
mProgress.setVisibility(View.GONE)
,但它没有显示。由于这只是一个旋转的过程,我认为我不需要AsyncTask的
publishProgress
。不幸的是,您指出的线程中的答案对我不起作用,因为我的应用程序必须没有默认标题(因此我使用的是
窗口。功能\u NO\u TITLE
).谢谢你的信息though@Alesqui在布局视图中添加一个固定的
ProgressBar
,例如在布局的顶部,但带有
View.Gone
。如果要使用它,请将可见性设置为
View.Visible
,并使用
onPro将
异步任务的进度发布到
ProgressBar
gressUpdate()
这似乎太好了。我将标记ernazm的答案,因为它对我更有效(因为我已经尝试过了,现在已经开始工作了:D)非常感谢ernazm!它成功了!我误解了这里的事情,因为我的布局中发生了所有动态更改,只是跳过了“添加视图”部分。事实上,ProgressDialog不需要添加到任何布局中,这让我犯了这个错误。再次感谢您花时间帮助我