简体   繁体   English

检索XML文件时Android应用程序崩溃

[英]Android App Crashing While Retrieving XML File

I am developing a simple android app which will fetch and display a xml data in textview. 我正在开发一个简单的android应用程序,它将在textview中获取并显示xml数据。 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文件:

<?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. 但是这些应用无法正常运行,并且无法获取URL数据。 I am targeting it on my Samsung Galaxy S3 with 3G Connection.Can anybody please help? 我将其定位在具有3G连接功能的三星Galaxy S3上,有人可以帮忙吗?

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

You can't make network processing in your Main Thread . 无法在主线程中进行网络处理 So you need to use AsyncTask . 因此,您需要使用AsyncTask Retrieve the data in doInBackground() and finally display it in textview or other in postExecute() Try using AsyncTask as follows: 检索doInBackground的数据(),最后在postExecute TextView的或其他显示它() 尝试使用的AsyncTask如下:

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. 您无法在主线程(UI线程)中进行网络处理Android绝对不允许您这样做,因此您应该通过创建新线程来使用异步任务来执行此操作。

Read this: 读这个:

http://developer.android.com/reference/android/os/AsyncTask.html 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));
        }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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