首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >AsyncTask doInBackground中的NetworkOnMainThreadException

AsyncTask doInBackground中的NetworkOnMainThreadException
EN

Stack Overflow用户
提问于 2018-06-02 04:58:09
回答 1查看 179关注 0票数 0

我正在尝试通过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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-02 04:59:25

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

new ParseRouteXML().execute(routeUrl);

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50650919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档