java - 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)
解决方案
因为 doInBackground(routeUrl) 将在同一个线程中执行。你需要这样做:
new ParseRouteXML().execute(routeUrl);
异步任务将在后台线程中完成所有工作。
推荐阅读
- sql - 午夜事务的 SQL 查询
- javascript - 当模式关闭vue时如何运行语句?
- android - 删除以编程方式添加的RelativeLayout.END_OF,android 5.0我不能,但android 8我可以
- python - 读取 URL 不显示其内容
- mysql - 如何使用 MySQL 过程在同一服务器的另一个数据库中动态创建表?
- php - 按字母顺序对集合进行排序
- node.js - logstash vs nodejs应用程序的任务队列
- python - Python目录爬虫扫描各类文件并搜索关键字
- reactjs - 使用 react-router v4 更改 url 中的参数之一
- batch-file - 如何批量检查多个空变量