2011-02-10 52 views
3

我解析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中?

+0

粘贴正在使用的异步任务,以及如何尝试调用publishProgress方法。 – Cristian 2011-02-10 19:37:12

回答

1

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

+2

谢谢Mayra!关键是如您所建议的那样将SaxClientsHandler()代码复制到RotationAwareTask中。我不知道你可以像这样嵌套类。事实上,我甚至都不知道从哪里开始寻找,而且我至少在一周内一直在与之作斗争。 – 2011-02-10 20:56:38