2013年7月8日 星期一

android.os.NetworkOnMainThreadException

Since Android API level 11, android.os.NetworkOnMainThreadException is added to throw exception when any network operation is performed in UI thread (main thread). The purpose is obviously to avoid possible system hang or display delay due to time-consuming network operations. Instead, one should perform network operations using AsyncTask to create a thread as following:

public class XMLParseTestActivity extends Activity {
    XMLParser parser = new XMLParser();
    String xml = null;
    String url = null;
    Document doc = null;

   
...


    class MyAsyncTask extends AsyncTask<Void, Void, Void>    {
       
        MyAsyncTask()    {
                    
        }
        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            doc = parser.getDomElement(xml);
            displayNavXml();
        }
        @Override
        protected void onPreExecute() {
            String nav_url = "http://trailers.apple.com/appletv/us/nav.xml";
            super.onPreExecute();
            url = nav_url;
        }
        @Override
        protected Void doInBackground(Void... arg0) {
            xml = parser.getXmlFromUrl(url);
            return null;
        }
    }  

   
    public void parseTargetXML(View view) throws IOException {
        MyAsyncTask myWebFetch = new MyAsyncTask();
        myWebFetch.execute();
    }

   
    private void displayNavXml() {
        NodeList nl = doc.getElementsByTagName("navigationItem");
   
        for (int i = 0; i < nl.getLength(); i++) {
            Element e = (Element) nl.item(i);
            String title = parser.getValue(e, "title");
            String url = parser.getValue(e, "url");
            System.out.println("<"+title+","+url+">");
        }
    }


...
}


This code snippet performs a XML parsing operation. It firstly fetches XML through HTTP over internet and then parse the content and display. parseTargetXML() is a onClick() function called whenever a defined button is pressed.

Reference
http://subinsebastien.tumblr.com/post/10319834334/simple-asynctask-example-in-android

沒有留言:

張貼留言