我和“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
答案 0 :(得分:2)
正如我所说,你需要ProgressBar
。它不适合您的原因是ProgressBar
是View
,与其他View
一样,必须将其添加到要显示的某个父级。请参阅一些tutorial并注意xml布局。
答案 1 :(得分:0)
您当前正在ProgressDialog
上显示onPreExecute()
,这意味着您的UI线程将被Dialog阻止。我建议你使用ProgressBar
之类的ernazm,并使用onProgressUpdate()
发布AsyncTask后台工作的进度。您可以在{<3}}上将ProgressBar
放在应用程序的标题栏上,如SO