简体   繁体   中英

Android App Crashing While Retrieving XML File

I am developing a simple android app which will fetch and display a xml data in textview. The following is the code.

try {
            t1 = (TextView)findViewById(R.id.textView2);
            URL url = new URL("http://www.sevenzaseo.com/androidapi.php");
            URLConnection conn = url.openConnection();

            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(conn.getInputStream());

            NodeList nodes = doc.getElementsByTagName("socialinfo");
            for (int i = 0; i < nodes.getLength(); i++) {
                Element element = (Element) nodes.item(i);
                NodeList title = element.getElementsByTagName("facebooklikes");
                Element line = (Element) title.item(0);
                t1.setText(line.getTextContent());
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }

And The XML File :

<?xml version="1.0" encoding="utf-8"?><xml>
<socialinfo>
    <facebooklikes>420</facebooklikes>
    <twitterfollowers>12</twitterfollowers>
    <googleplusfollowers>121</googleplusfollowers>
    <linkedinfollowers>24</linkedinfollowers>
    <websiteviews>500</websiteviews>
</socialinfo>
</xml>

But the apps is not working and it is not fetching the URL data. I am targeting it on my Samsung Galaxy S3 with 3G Connection.Can anybody please help?

您正在UI线程上使用网络,将其删除并使用异步任务

You can't make network processing in your Main Thread . So you need to use AsyncTask . Retrieve the data in doInBackground() and finally display it in textview or other in postExecute() Try using AsyncTask as follows:

public class MyAsync extends AsyncTask<String, Void, JSONObject> {

    @Override
    protected JSONObject doInBackground(String... args) {


        try {


            }
        } catch () {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(JSONObject url) {

        // updating UI from Background Thread for some case. you may remove this as well
        getActivity().runOnUiThread(new Runnable() {
            public void run() {
                //do something at last, may be display result to textview or use adapter
            }
        });
    }
}

You may want to look at this and this

You can't make network processing in your Main Thread(UI Thread) Android never let you to do so you should to use Async Task by creating a new thread in order to do this.

Read this:

http://developer.android.com/reference/android/os/AsyncTask.html

Use this code inplace of your code it will solve your problem

static final String URL = "http://www.sevenzaseo.com/androidapi.php";
    // XML node keys
    static final String KEY_TASK = "socialinfo"; // parent node
    static final String KEY_FACEBOOKLIKE = "facebooklikes";
    static final String KEY_TWITTERFOLL = "twitterfollowers";
    static final String KEY_GOODLEPLUS = "googleplusfollowers";
    static final String KEY_LINKEDIN = "linkedinfollowers";
    static final String KEY_WESITEVIEW = "websiteviews";


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

            XMLParser parser = new XMLParser();
            String xml = parser.getXmlFromUrl(URL); // getting XML
            Document doc = parser.getDomElement(xml); // getting DOM element

            NodeList nl = doc.getElementsByTagName(KEY_TASK);
            // looping through all task nodes <task>
            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_FACEBOOKLIKE, parser.getValue(e, KEY_FACEBOOKLIKE));
                map.put(KEY_TWITTERFOLL, parser.getValue(e, KEY_TWITTERFOLL));
                map.put(KEY_GOODLEPLUS,parser.getValue(e, KEY_GOODLEPLUS));
                map.put(KEY_LINKEDIN,"Linkined: " + parser.getValue(e, KEY_LINKEDIN));
                map.put(KEY_WESITEVIEW,"WebsiteCount: " + parser.getValue(e, KEY_WESITEVIEW));

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

Create this class in your package folder

public class XMLParser {

    // constructor
    public XMLParser() {

    }

    /**
     * Getting XML from URL making HTTP request
     * @param url string
     * */
    public String getXmlFromUrl(String url) {
        String xml = null;

        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(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;
    }

    /**
     * Getting XML DOM element
     * @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;
    }

    /** Getting node value
      * @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 "";
     }

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM