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

时间:2014-08-07 10:24:22

标签: android

我正在开发一个简单的Android应用程序,它将在textview中获取并显示xml数据。以下是代码。

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

和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>

但是应用程序无法运行,并且没有获取URL数据。我的目标是在我的三星Galaxy S3上使用3G连接。任何人都可以帮忙吗?

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

无法在主线程中进行网络处理。所以你需要使用 AsyncTask 。检索doInBackground()中的数据,最后在 textview 或其他 postExecute()中显示 尝试使用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
            }
        });
    }
}

您可能需要查看thisthis

答案 2 :(得分:0)

您无法在主线程(UI线程)中进行网络处理Android永远不会让您这样做,您应该通过创建新线程来使用Async Task来执行此操作。

阅读本文:

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

答案 3 :(得分:0)

使用此代码代替您的代码,它将解决您的问题

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

在您的包文件夹中创建此类

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