Android 4.1 SDK:读取URL处的文件内容会导致Android.os.NetworkOnMainThreadException
我在这里找到了从URL读取文本响应的方法,因此代码编译得很好,但在线程启动时导致应用程序崩溃:Android 4.1 SDK:读取URL处的文件内容会导致Android.os.NetworkOnMainThreadException,android,url,Android,Url,我在这里找到了从URL读取文本响应的方法,因此代码编译得很好,但在线程启动时导致应用程序崩溃: Thread thread = new Thread(new Runnable() { public void run() { try { URL url = new URL("http://192.168.1.10/test.php"); BufferedReader in = new BufferedReader(new
Thread thread = new Thread(new Runnable() {
public void run() {
try {
URL url = new URL("http://192.168.1.10/test.php");
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
String line = null;
while ((line = in.readLine()) != null) {
//do stuff
}
in.close();
}catch (MalformedURLException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
}
});
我做了进一步的搜索,一个关于SO的回答建议向清单文件添加权限,如下所示:
<uses-permission android:name="android.permission.INTERNET" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
</uses-permission>
但我还是得到了同样的结果:
06-21 15:48:24.597 2362-2362/? E/AndroidRuntime: FATAL EXCEPTION: main
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
at java.net.InetAddress.getAllByName(InetAddress.java:220)
at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71)
at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
at java.net.URL.openStream(URL.java:462)
at com.smilegrp.ksone.MainActivity$2$1$1.run(MainActivity.java:51)
at java.lang.Thread.run(Thread.java:856)
at com.smilegrp.ksone.MainActivity$2$1.onClick(MainActivity.java:68)
at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4575)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
at dalvik.system.NativeStart.main(Native Method)
为什么会这样?我以前在iOS中编写过代码,我发现谷歌的官方文档与苹果的相比相当混乱,难以理解:/ 错误是:NetworkOnMainThreadException。这意味着您不能在主线程上进行网络操作。
创建一个Asynctask,并在Asynctask的doInBackground方法中执行网络操作。异常表示您正在UI线程上执行网络操作。因为你是在一个线程中运行它,所以一定要调用start而不是在线程的实例上运行为什么其他人对此没有任何问题。自从新的安卓4.0以来,你必须在后台线程上进行网络操作。你不希望你的整个应用程序因为无法访问服务器而挂起:@harmjanr他正在使用一个线程。。。所以要么是他用错了,要么是黑带的答案,要么就是这个代码中没有例外。@Selvin,哦,没有看到:但仍然是;使用AsynchTasks更有用,因为您有比创建新的可运行OnPreExecute、OnPostExecute更多的选项。使用AsynchTask调用URL,否决的原因是?这是一个众所周知的问题,您将收到大量与此查询相关的问题!!!