How to get XML using AsyncTask and PublishProgress
我解析 XML 数据并将其放入一个对象中。这需要相当长的时间,我决定使用 AsyncTask 在后台运行它。我的代码几乎和这个例子一模一样:
如何使用 AsyncTask 和 Timer 获取 XML?
不同之处在于我想在我走多远的时候发布Progress。我要发布进度的代码的相关部分:
1 2 3 4 5 6 7 8 9 | @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
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 这里是异步任务:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | 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 中?
你在做