我解析XML数据并将其放入一个对象中。这需要相当长的时间,我决定使用AsyncTask在后台运行它。我的代码几乎完全像这个例子: How to get XML using AsyncTask and Timer?如何使用AsyncTask和PublishProgress获取XML
不同的是,我想发布进度,因为我走了很久。我想要发布进度的代码的相关部分:
@Override
public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
if (localName.equalsIgnoreCase("client")) {
clients.addClient(mClient);
// Publish Progress
RotationAwareTask.publishProgress();
mClient = null;
}
}
现在,您将会推断出我是新手。符合什么我想要做的最近研究指出:
http://www.mail-archive.com/[email protected]/msg79275.html
是的,这是一个有点复杂...两个 方法:
1)制作的AsyncTask实现 组织。 sax.ContentHandler。这样 SAX回调可以直接访问 AsyncTask.publishProgress()。
2)创建一个委托,以便 解析器具有返回AsyncTask 的句柄以发布进度更新。
当我尝试了上面我得到:
从 类型的AsyncTask方法 publishProgress(进展...)是 不可见
唉,我怎么能从endElement调用publicProgress?或者可以有人给我一些如何正确地做到这一点?回顾:
我有XML数据。读取数据是一项长期操作。 我使用SAXParser来获取数据。 在endElement方法上,数据被添加到最终将在别处使用的对象。 大多数研究表明我必须使用AsyncTask,现在我正在使用它,因为我从Commonsware的屏幕旋转有一个很好的例子。 问题是如何随着我的进展更新进度。
编辑: 这里@Cristian是异步任务:
static class RotationAwareTask extends AsyncTask<Void, Void, Void> {
RotationAsync activity = null;
int progress = 0;
private SaxClientsHandler saxClientsHandler;
RotationAwareTask(RotationAsync activity) {
attach(activity);
}
@Override
protected Void doInBackground(Void... unused) {
try {
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
saxClientsHandler = new SaxClientsHandler();
xr.setContentHandler(saxClientsHandler);
InputSource mSource = new InputSource(new StringReader(Whmcs.getClientsXml()));
xr.parse(mSource);
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
}
return(null);
}
@Override
protected void onProgressUpdate(Void... unused) {
if (activity==null) {
Log.w("RotationAsync", "onProgressUpdate() skipped – no activity");
}
else {
progress += 5;
activity.updateProgress(progress);
}
}
@Override
protected void onPostExecute(Void unused) {
if (activity == null) {
Log.w("RotationAsync", "onPostExecute() skipped – no activity");
}
else {
activity.markAsDone();
}
}
void detach() {
activity = null;
}
void attach(RotationAsync activity) {
this.activity = activity;
}
int getProgress() {
return(progress);
}
}
这是本Commonsware例子几乎如出一辙: https://github.com/commonsguy/cw-android/blob/master/Rotation/RotationAsync/src/com/commonsware/android/rotation/async/RotationAsync.java
正如你可以看到:
saxClientsHandler = new SaxClientsHandler();
调用存在endElement方法的SaxClientHandler()。我正试图从那里发布进度。
@Mayra,你是否建议我将所有的saxClientHandler代码迁移到AsyncTask中?
粘贴正在使用的异步任务,以及如何尝试调用publishProgress方法。 – Cristian 2011-02-10 19:37:12