gpt4 book ai didi

android - 如何使用 AsyncTask 和 PublishProgress 获取 XML

转载 作者:数据小太阳 更新时间:2023-10-29 02:42:38 26 4
gpt4 key购买 nike

我解析 XML 数据并将其放入一个对象中。这需要相当长的时间,我决定使用 AsyncTask 在后台运行它。我的代码几乎与这个例子完全一样: How to get XML using AsyncTask and Timer?

不同之处在于我想在做多时发布进度。我要发布进度的代码的相关部分:

@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/android-developers@googlegroups.com/msg79275.html

Yes, that is a bit more complex... Two approaches:

1) Make AsyncTask implement org.sax.ContentHandler. That way the SAX callbacks have direct access to AsyncTask.publishProgress().

2) Create a delegate so that the parser has a handle back to AsyncTask for posting progress updates.

当我尝试上面的方法时,我得到:

The method publishProgress(Progress...) from the type AsyncTask is not visible

唉,我怎么能从 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 中吗?

最佳答案

你在做 RotationAwareTask.publishProgress(); publishProgress 不是静态方法,你需要在 RotationAwareTask 的实例上调用它.

关于android - 如何使用 AsyncTask 和 PublishProgress 获取 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4961586/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com