Android - 非阻塞旋转ProgressDialog

时间:2011-08-16 15:04:38

标签: android

我和“ProgressThings”度过了一段美好时光。我有一个动态更改视图内容的应用程序(甚至视图本身可能会更改,消失,重新添加,等等)。有些类可以处理主Activity的特定“样式”。其中一个下载XML文件,解析它(有一个特定的类来处理它),并根据下载的内容向用户显示一些内容。

无论如何,我的问题是我希望ProgressDialog是非阻塞的,这样用户可以在等待时与其他应用程序的功能进行交互。我已经阅读了一些与此问题相关的答案(例如this one),但到目前为止我还没有成功。使用“setIndeterminate(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
        }
    }
}

P.S。:我没有为XmlHandler类设置代码,因为没有必要; P

P.S.2:提前感谢您的帮助:D

2 个答案:

答案 0 :(得分:2)

正如我所说,你需要ProgressBar。它不适合您的原因是ProgressBarView,与其他View一样,必须将其添加到要显示的某个父级。请参阅一些tutorial并注意xml布局。

答案 1 :(得分:0)

您当前正在ProgressDialog上显示onPreExecute(),这意味着您的UI线程将被Dialog阻止。我建议你使用ProgressBar之类的ernazm,并使用onProgressUpdate()发布AsyncTask后台工作的进度。您可以在{<3}}上将ProgressBar放在应用程序的标题栏上,如SO