簡體   English   中英

在android中從URL獲取XML

[英]Get XML from url in android

我是android新手。 我想從URL獲取XML。 我的申請非常簡單。 MainActivity有一個按鈕,可導航到下一個屏幕並顯示XML數據

以下是我從在線來源獲得的示例代碼,但對我而言不起作用。 它什么也不顯示。

private class LongOperation extends AsyncTask<String, Void, LinearLayout> {

    @Override
    protected LinearLayout doInBackground(String... string) {
        LinearLayout layout = new LinearLayout(DevicesActivity.this);
        layout.setOrientation(1);
        /** Create a new textview array to display the results */ 
        TextView name[];
        TextView website[];
        TextView category[];
        try {
            URL url = new URL(
                    "http://www.androidpeople.com/wp-content/uploads/2010/06/example.xml");
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(new InputSource(url.openStream()));
            doc.getDocumentElement().normalize();
            NodeList nodeList = doc.getElementsByTagName("item");
            /** Assign textview array lenght by arraylist size */
            name = new TextView[nodeList.getLength()];
            website = new TextView[nodeList.getLength()];
            category = new TextView[nodeList.getLength()];
            for (int i = 0; i < nodeList.getLength(); i++) {
                Node node = nodeList.item(i);
                name[i] = new TextView(DevicesActivity.this);
                website[i] = new TextView(DevicesActivity.this);
                category[i] = new TextView(DevicesActivity.this);
                Element fstElmnt = (Element) node;
                NodeList nameList = fstElmnt.getElementsByTagName("name");
                Element nameElement = (Element) nameList.item(0);
                nameList = nameElement.getChildNodes();
                name[i].setText("Name = "
                        + ((Node) nameList.item(0)).getNodeValue());
                NodeList websiteList = fstElmnt.getElementsByTagName("website");
                Element websiteElement = (Element) websiteList.item(0);
                websiteList = websiteElement.getChildNodes();
                website[i].setText("Website = "
                        + ((Node) websiteList.item(0)).getNodeValue());
                category[i].setText("Website Category = "
                        + websiteElement.getAttribute("category"));
                layout.addView(name[i]);
                layout.addView(website[i]);
                layout.addView(category[i]);
            }
        } catch (Exception e) {
            System.out.println("XML Pasing Excpetion = " + e);
        }
        /** Set the layout view to display */
        return layout;
    }      

    protected void onPostExecute(LinearLayout result) {
        setContentView(result);
        // here you will get the result
    }
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    /** Create a new layout to display the view */
     //setContentView(R.layout.activity_devices);
     new LongOperation().execute("");

}

LogCat的日志

05-29 16:00:50.972: I/Choreographer(6780): Skipped 33 frames!  The application may be doing too much work on its main thread.
05-29 16:00:51.122: D/gralloc_goldfish(6780): Emulator without GPU emulation detected.
05-29 16:00:54.252: I/System.out(6780): XML Pasing Excpetion = android.os.NetworkOnMainThreadException
05-29 16:00:55.663: I/Choreographer(6780): Skipped 71 frames!  The application may be doing too much work on its main thread.

更新

05-29 19:55:38.952: E/Trace(7739): error opening trace file: No such file or directory (2)
05-29 19:55:41.022: D/gralloc_goldfish(7739): Emulator without GPU emulation detected.
05-29 19:55:48.472: I/Choreographer(7739): Skipped 31 frames!  The application may be doing too much work on its main thread.
05-29 19:55:49.182: I/Choreographer(7739): Skipped 68 frames!  The application may be doing too much work on its main thread.
05-29 19:55:50.662: I/System.out(7739): XML Pasing Excpetion = java.lang.SecurityException: Permission denied (missing INTERNET permission?)

您不能在主線程中執行Http調用,請改用AsyncTask。

創建一個擴展AsyncTask的內部類,並在doInBackground方法內進行工作

private class LongOperation extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... params) {
        // do your call here
    }      

    @Override
    protected void onPostExecute(String result) {               
        // here you will get the result
    }
}

您可以這樣在onCreate中調用它:

new LongOperation().execute("myParams");

當某些網絡操作在主線程中運行時,android返回此異常。 您應該嘗試asynctask類。 其余代碼似乎還可以。 閱讀有關asynctask的文檔。 希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM