首页 > 解决方案 > AsyncTask doInBackground 中的 NetworkOnMainThreadException

问题描述

我正在尝试通过 URL 解析来自 XML 页面的数据。但是,尽管我的所有网络连接代码都在 AsyncTask doInBackground 中,但我仍然不断收到“NetworkOnMainThreadException”。有人可以帮我指出正确的方向吗?

类扩展 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;
}
}

调用类的方法

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

错误日志

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)

标签: javaandroid

解决方案


因为 doInBackground(routeUrl) 将在同一个线程中执行。你需要这样做:

new ParseRouteXML().execute(routeUrl);

异步任务将在后台线程中完成所有工作。


推荐阅读