- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我解析 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/
当我尝试下载文件时,应用程序崩溃。 问题是当我刷新进度条时。我使用asynctask.The错误是这样的: while ((read = is.read(buffer, 0, 1024)) > 0)
我写了一个AsyncTask: public class AudioTransition extends AsyncTask { private int goalID; priv
这就是我遇到的问题:每当 publishProgress(sentCount);在应用程序崩溃时被调用。我环顾四周,仍然不知道这是什么原因。任何帮助是极大的赞赏!谢谢 class MySmsTask
我正在尝试更新进度对话框以增加 1-100% 之类的值。但是,没有任何东西会增加。它总是只显示 0。尽管如此,我能够在我的 Log Cat 中看到打印出的数字,并且一切都在 100 之后结束。 有人看
我有一个 AsyncTask,它使用轮询队列来查看是否有新对象到达。当它检测到新对象时,我让它以字符串形式收集信息,然后发布进度(信息)。在 onProgressUpdate 中,它将字符串添加到列表
我正在尝试在进度对话框中显示 3 条不同的消息。 在 onPreExecute 中,我创建对话框并设置第一条消息。 在 doInBackground 中,我调用 publishProgres("sen
假设我有一个非常简单的长时间运行的任务作为 AsyncTaskLoader: public class DumbLoader extends AsyncTaskLoader{ private s
我有以下代码在异步任务中运行客户端套接字连接: @Override protected Boolean doInBackground(Void... params) { //This runs on
我已经多次使用 AsyncTask - 但我遇到了一个看似简单的问题却让我感到困惑。问题是这样的: Is publishProgress(Progress... values) supposed to
我的实际任务正在完成,但是即使我调用进度对话框,我的进度条的进度状态也没有任何增加..?有人能告诉我哪里做错了吗? class A extends AsyncTask
我试图在后台进程中发布两种不同的进度。我试图有时发布一个字符串,另一次发布一个整数。我也通过重载处理 onProgressUpdate 中的两种参数。但是当我声明我的 AsyncTask 类时,我有参
由于垃圾收集器被调用了很多次,我一直在寻找一种在循环语句中 x 秒后调用 publishProgress() 的方法。 这是我的: protected Void doInBackground(Void
我已经查看过有关此问题的所有类似线程,但找不到解决我的问题的方法 我的 AsynkTask 应该从保管箱下载文件并在通知进度条中显示进度。 doInBackground 下载文件,但方法 publis
我正在尝试实现简单的内部数据存储代码。我想在其中显示一些后台进程的 ProgressDialog,在调用 publishProgress() 时该进程将递增 5。但它给我如下错误, The metho
我已经阅读了这里几乎所有关于使用 publishProgress 在进度对话框上设置新消息的帖子,但我就是无法让它工作。 代码: public class LoginToApi extends Asy
我解析 XML 数据并将其放入一个对象中。这需要相当长的时间,我决定使用 AsyncTask 在后台运行它。我的代码几乎与这个例子完全一样: How to get XML using AsyncTas
我的 AsyncTask 看起来像: private class MyTask extends AsyncTask> { private volatile UserData userData;
我在这上面花了太多时间,到目前为止,我一直没有使用 publishProgress() 功能……幸运的是,onPostExecute 也在 UI 线程中运行,所以我不得不为我想要的每个图像创建 N 个
Developer.Android 说 PublishProgress 驻留在 UI 线程中,因此我应该能够从 Publish Progress 更改 UI。 但是,我得到这个错误: android.
我是一名优秀的程序员,十分优秀!