Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 4.1 SDK:读取URL处的文件内容会导致Android.os.NetworkOnMainThreadException_Android_Url - Fatal编程技术网

Android 4.1 SDK:读取URL处的文件内容会导致Android.os.NetworkOnMainThreadException

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

我在这里找到了从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 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,否决的原因是?这是一个众所周知的问题,您将收到大量与此查询相关的问题!!!