2013-07-17 124 views
-1

我正在處理一個項目,我的XMLParser.java使應用程序的力量在Android 4.0或更新版本的設備上關閉。 我知道我應該實施異步,但我不知道如何。 有人能幫助我嗎? 這裏是XMLParser.java代碼:android.os.NetworkOnMainThreadException - XML解析

import *stuff 


public class XMLParser { 

    public XMLParser() { 

    } 


    public String getXmlFromUrl(String url) { 
     String xml = null; 

     try { 
     // defaultHttpClient 
     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpGet httpPost = new HttpGet(url); 

     HttpResponse httpResponse = httpClient.execute(httpPost); 
     HttpEntity httpEntity = httpResponse.getEntity(); 
     xml = EntityUtils.toString(httpEntity); 

     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 
    // return XML 
    return xml; 
    } 

    public Document getDomElement(String xml){ 
     Document doc = null; 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     try { 

      DocumentBuilder db = dbf.newDocumentBuilder(); 

      InputSource is = new InputSource(); 
       is.setCharacterStream(new StringReader(xml)); 
       doc = db.parse(is); 

      } catch (ParserConfigurationException e) { 
       Log.e("Error: ", e.getMessage()); 
       return null; 
      } catch (SAXException e) { 
       Log.e("Error: ", e.getMessage()); 
       return null; 
      } catch (IOException e) { 
       Log.e("Error: ", e.getMessage()); 
       return null; 
      } 

      return doc; 
     } 

    public final String getElementValue(Node elem) { 
     Node child; 
     if(elem != null){ 
      if (elem.hasChildNodes()){ 
       for(child = elem.getFirstChild(); child != null; child =  child.getNextSibling()){ 
        if(child.getNodeType() == Node.TEXT_NODE ){ 
         return child.getNodeValue(); 
        } 
       } 
      } 
     } 
     return ""; 
    } 

    public String getValue(Element item, String str) {  
      NodeList n = item.getElementsByTagName(str);   
      return this.getElementValue(n.item(0)); 
     } 
} 
+0

你是如何在失敗使用AsyncTask?你有什麼嘗試? – RvdK

+0

那麼,在這個例子中,我得到一個名爲url的字符串並返回一個名爲xml的字符串。通過使用AsyncTask,我不能將某些東西返回給字符串。 – ionutzm05

回答

1

可以使用droidQuery庫做你正在嘗試做的一切(沒有任何錯誤):

$.ajax(new AjaxOptions(url).context(this) 
          .type("GET") 
          .dataType("XML") 
          .success(new Function() { 
           @Override 
           public void invoke($ droidQuery, Object... params) { 
            Document xml = (Document) params[0]; 
            //TODO parse XML Document 
           } 
          }) 
          .error(new Function() { 
           @Override 
           public void invoke($ droidQuery, Object... params) { 
            droidQuery.alert("ERROR: " + (String) params[2]); 
           } 
          }));