-3

我在 SO 上找到了从 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 中编写过代码,我发现与 Apple 相比,Google 的官方文档相当混乱且难以理解。:/

4

2 回答 2

1

异常意味着您正在对UI Thread. 由于您在 a 内运行它,Thread因此请务必调用start()而不是run()Thread' 实例上

于 2013-06-21T09:00:31.023 回答
0

错误是:NetworkOnMainThreadException。这意味着你不能在你的主线程上做网络事情。创建一个 Asynctask,并在 Asynctask 的 doInBackground 方法中做你的网络工作。

于 2013-06-21T08:59:08.807 回答