2012-07-10 126 views
0

我有一个解析XML文件的HTTP请求。 我试图从asyntask连接到互联网,但我一直没能在AsyncTask中的HTTP请求

我通过把代码中的线程内做到这一点和作品,而不是内部的AsycTask 我的问题是,HTTP请求是一个字符串内调用这行代码:

String xml = parser.getXmlFromUrl(URL); 

运行此

public String getXmlFromUrl(String url) { 
      Thread t= new Thread(){ 
       public void run() { 
        xml = null;    
        try { 
         Log.i("Log1","Parse"); 
         // defaultHttpClient 
         DefaultHttpClient httpClient = new DefaultHttpClient(); 
         HttpPost httpPost = new HttpPost("http://api.androidhive.info/music/music.xml"); 

         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(); 
        } 
        mHandler.post(mUpdateResults); 
       } 
      }; 
      t.start(); 
      return xml; 
     } 

     final Runnable mUpdateResults =new Runnable(){ 
      public void run(){//2 

      } 
     }; 

正如我提到的那样,HTTP请求是在一个线程中,但我总能找到错误,当我试图把它在一个AsycTa里面sk ...我不知道该怎么做。

我已经被引用到AsycTask的文档并阅读了很多次,我已经搜索了教程,但是我无法正确构建它。

经过两次天,我开始有点绝望

我把完整的代码对我的工作,如果有人能告诉我如何更换的AsyncTask线程,我将非常感激。

非常感谢你,并认为

充分的活动:

public class PruebasActivity extends Activity { 


    static final String URL = "http://api.androidhive.info/music/music.xml"; 
    // XML node keys 
     static final String KEY_SONG = "song"; // parent node 
     static final String KEY_ID = "id"; 
     static final String KEY_TITLE = "title"; 
     static final String KEY_ARTIST = "artist"; 
     static final String KEY_DURATION = "duration"; 
     static final String KEY_THUMB_URL = "thumb_url"; 

     private ArrayList<HashMap<String, String>> data; 
     ArrayList<HashMap<String, String>> songsList; 

     ListView list; 
     LazyAdapter adapter; 
     String xml; 

     final Handler mHandler=new Handler(); 


     // constructor 
     public void XMLParser() { 

     } 

     /** 
     * Cogiendo el XML de la URL mediante HTTP request 
     * @param url string 
     * */ 
     public String getXmlFromUrl(String url) { 
      Thread t= new Thread(){ 
       public void run() { 
        xml = null;    
        try { 
         Log.i("Log1","Parse"); 
         // defaultHttpClient 
         DefaultHttpClient httpClient = new DefaultHttpClient(); 
         HttpPost httpPost = new HttpPost("http://api.androidhive.info/music/music.xml"); 

         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(); 
        } 
        mHandler.post(mUpdateResults); 
       } 
      }; 
      t.start(); 
      return xml; 
     } 

     final Runnable mUpdateResults =new Runnable(){ 
      public void run(){//2 

      } 
     }; 

     /* 
     * @param XML string 
     * */ 
     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; 
     } 

     /* 
     * @param elem element 
     */ 
     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 ""; 
     } 

     /* 
     * @param Element node 
     * @param key string 
     * */ 
     public String getValue(Element item, String str) {  
      NodeList n = item.getElementsByTagName(str);   
      return this.getElementValue(n.item(0)); 
     } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     list=(ListView)findViewById(R.id.list); 

     songsList = new ArrayList<HashMap<String, String>>(); 

     XMLParser parser = new XMLParser(); 
     String xml = parser.getXmlFromUrl(URL); // Cogiendo XML de la URL 
     Document doc = parser.getDomElement(xml); // Cogiendo DOM de los elementos 

     NodeList nl = doc.getElementsByTagName(KEY_SONG); 
     // looping through all song nodes <song> 
     for (int i = 0; i < nl.getLength(); i++) { 
      // creating new HashMap 
      HashMap<String, String> map = new HashMap<String, String>(); 
      Element e = (Element) nl.item(i); 
      // adding each child node to HashMap key => value 
      map.put(KEY_ID, parser.getValue(e, KEY_ID)); 
      map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE)); 
      map.put(KEY_ARTIST, parser.getValue(e, KEY_ARTIST)); 
      map.put(KEY_DURATION, parser.getValue(e, KEY_DURATION)); 
      map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL));   

      // adding HashList to ArrayList 
      songsList.add(map); 
     } 

     // Pasando datos parseados del adaptador al arrayList 
     adapter=new MinAdapter(this, songsList);   
     list.setAdapter(adapter); 
    } 
} 
+0

我认为如果您在AsyncTask中尝试使用代码以及堆栈跟踪时发布代码会更有帮助。 – bytebender 2012-07-10 17:45:40

回答

0

HTTP请求可以的AsyncTask的doInBackground功能运行,可运行的是onPostExecute功能。 结果是这样的:

public class XmlTask extends AsyncTask<String, Void, String>{ 

    public String doInBackground(String... urls){ 
     String url = urls[0]; 

     // Place your getXmlFromUrl content here 

     return xml; 
    } 

    public void onPostExecute(String xml){ 
     // Your XML parsing staement here 
    } 
} 

在该代码中,线程和可运行是不必要的。

而在你活动只需轻按:

new XmlTask().execute("http://yoururl"); 
+0

hi 当我将适配器连接到OnPostExecute的列表视图时出现错误 songsList = new ArrayList >(); ... adapter = new MinAdapter(this,songsList); 列表。setAdapter(adapter); MinAdapter方法,属于MinAdapter活动: 公共MinAdapter(活性的,ArrayList的> d){ 活性= A; data = d; inflater =(LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); imageLoader = new ImageLoader(activity.getApplicationContext()); } 错误在哪里? 谢谢 – Sergio76 2012-07-10 22:54:05

+0

你可以发布你的stacktrace吗? – throrin19 2012-07-11 07:07:15

+0

解决了!非常感谢:) – Sergio76 2012-07-11 08:57:14

0

下面的代码应该为你工作。试试看:

public class PruebasActivity extends Activity { 

static final String URL = "http://api.androidhive.info/music/music.xml"; 
// XML node keys 
    static final String KEY_SONG = "song"; // parent node 
    static final String KEY_ID = "id"; 
    static final String KEY_TITLE = "title"; 
    static final String KEY_ARTIST = "artist"; 
    static final String KEY_DURATION = "duration"; 
    static final String KEY_THUMB_URL = "thumb_url"; 

    private ArrayList<HashMap<String, String>> data; 
    ArrayList<HashMap<String, String>> songsList; 

    ListView list; 
    LazyAdapter adapter; 
    String xml; 

    // constructor 
    public void XMLParser() { 

    } 

    /** 
    * Cogiendo el XML de la URL mediante HTTP request 
    * @param url string 
    * */ 
    public String getXmlFromUrl(String url) { 
      xml = null;    
      try { 
       Log.i("Log1","Parse"); 
       // defaultHttpClient 
       DefaultHttpClient httpClient = new DefaultHttpClient(); 
       HttpPost httpPost = new HttpPost("http://api.androidhive.info/music/music.xml"); 

       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; 
    } 


    /* 
    * @param XML string 
    * */ 
    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; 
    } 

    /* 
    * @param elem element 
    */ 
    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 ""; 
    } 

    /* 
    * @param Element node 
    * @param key string 
    * */ 
    public String getValue(Element item, String str) {  
     NodeList n = item.getElementsByTagName(str);   
     return this.getElementValue(n.item(0)); 
    } 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    list=(ListView)findViewById(R.id.list); 

    AsyncTask<Void, Void, Void> ast = new AsyncTask<Void, Void, Void>(){ 
     ProgressDialog p; 
     @Override 
     protected void onPreExecute() { 
      // TODO Auto-generated method stub 
      p = new ProgressDialog(EditTextDemoActivity.this); 
      //write code to start the progress dialog 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      // TODO Auto-generated method stub 
      songsList = new ArrayList<HashMap<String, String>>(); 

      XMLParser parser = new XMLParser(); 
      String xml = parser.getXmlFromUrl(URL); // Cogiendo XML de la URL 
      Document doc = parser.getDomElement(xml); // Cogiendo DOM de los elementos 

      NodeList nl = doc.getElementsByTagName(KEY_SONG); 
      // looping through all song nodes <song> 
      for (int i = 0; i < nl.getLength(); i++) { 
       // creating new HashMap 
       HashMap<String, String> map = new HashMap<String, String>(); 
       Element e = (Element) nl.item(i); 
       // adding each child node to HashMap key => value 
       map.put(KEY_ID, parser.getValue(e, KEY_ID)); 
       map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE)); 
       map.put(KEY_ARTIST, parser.getValue(e, KEY_ARTIST)); 
       map.put(KEY_DURATION, parser.getValue(e, KEY_DURATION)); 
       map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL));   

       // adding HashList to ArrayList 
       songsList.add(map); 
      } 
     } 


     @Override 
     protected void onPostExecute(Void result) { 
      // TODO Auto-generated method stub 
      p.dismiss(); 
      adapter=new MinAdapter(this, songsList);   
      lst.setAdapter(adapter); 
     } 
    }; 

    ast.execute(); 
} 
} 

我已经使用AsyncTask实施了代码。当您使用AsyncTask时,您不需要任何其他Thread来实施后台活动。我已经留下了一小部分编码(创建并显示进度对话框)作为练习。

希望这会有所帮助。

+0

谢谢你太朋友:) – Sergio76 2012-07-11 09:00:19