0

I'm trying to parse data from an XML page via a URL. However, I still keep getting a "NetworkOnMainThreadException" despite having all my network connectivity code in AsyncTask doInBackground. Can someone help point me in the right direction?

Class extending AsyncTask

public class ParseRouteXML extends AsyncTask<String, URL, Route> {


@Override
protected Route doInBackground(String... urlString) {
    //Tags to look for
    InputStream stream = null;
    final String STOP = "stop";
    Route route = null;
    try {
        Log.i("Parser", "Creating factory");
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
        XmlPullParser parser = factory.newPullParser();

        //Establish connection
        Log.i("Parser", "Creating URL");
        URL url = new URL(urlString[0]);
        Log.i("Parser", "Creating connection");
        URLConnection connection = url.openConnection();
        Log.i("Parser", "Creating stream");
        stream = connection.getInputStream();

        Log.i("Parser", "Stream = " + stream.toString());
    } catch (Exception e) {
        e.printStackTrace();
    }
    return route;
}
}

Method calling the class

public void savedStopStopsClick(View v) {
    Log.i("Parser", "Running testMethod()");
    String routeUrl = "http://webservices.nextbus.com/service/publicXMLFeed?command=routeList&a=portland-sc";
    Route route = new ParseRouteXML().doInBackground(routeUrl);
}

Error log

W/System.err: android.os.NetworkOnMainThreadException
W/System.err:     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1450)
W/System.err:     at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:102)
W/System.err:     at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:90)
W/System.err:     at java.net.InetAddress.getAllByName(InetAddress.java:787)
W/System.err:     at com.android.okhttp.Dns$1.lookup(Dns.java:39)
W/System.err:     at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:175)
W/System.err:     at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:141)
W/System.err:     at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:83)
W/System.err:     at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:174)
W/System.err:     at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:126)
W/System.err:     at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:95)
W/System.err:     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:281)
W/System.err:     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:224)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:461)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:407)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:244)
W/System.err:     at com.android.tools.profiler.support.network.httpurl.TrackedHttpURLConnection.getInputStream(TrackedHttpURLConnection.java:356)
W/System.err:     at com.android.tools.profiler.support.network.httpurl.HttpURLConnection$.getInputStream(HttpURLConnection$.java:207)
W/System.err:     at ca.thepackage.myapp.ParseRouteXML.doInBackground(ParseRouteXML.java:35)
W/System.err:     at ca.thepackage.myapp.HomeActivity.savedStopStopsClick(HomeActivity.java:29)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:384)
W/System.err:     at android.view.View.performClick(View.java:6294)
W/System.err:     at android.view.View$PerformClick.run(View.java:24770)
W/System.err:     at android.os.Handler.handleCallback(Handler.java:790)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err:     at android.os.Looper.loop(Looper.java:164)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6494)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Kuris
  • 13
  • 3
  • By the way - https://stackoverflow.com/questions/12575068/how-to-get-the-result-of-onpostexecute-to-main-activity-because-asynctask-is-a?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa – OneCricketeer Jun 01 '18 at 21:01

1 Answers1

2

Because doInBackground(routeUrl) will be executed in the same thread. You need to do it like this:

new ParseRouteXML().execute(routeUrl);

And async task will do all the job in the background thread.

Alexei Artsimovich
  • 1,074
  • 7
  • 15