2

我找到了下面的代码,它应该让我从网络主机(在这种情况下是我的网站)读取目录内容

String urlStr = "http://2112design.com/tabs/drum_tabs";
URL url;
try {
    url = new URL(urlStr);
    java.net.URLConnection con = url.openConnection();
    con.connect();
    java.io.BufferedReader in =
      new java.io.BufferedReader(new java.io.InputStreamReader(con.getInputStream()));
    String line;
    for (; (line = in.readLine()) != null; ) {
        Log.d("MainActivity", "read from web "+line);
    }
} catch (MalformedURLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

当我运行它时, con.connect(); 失败并出现如下错误跟踪:

android.os.NetworkOnMainThreadException
android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
java.net.InetAddress.lookupHostByName(InetAddress.java:385)

看起来存在某种权限问题StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118),但是当我在同一设备上使用网络浏览器并转到该 URL 时,它可以正常打开。

我对webby的东西不是很好,有人可以帮忙吗,谢谢

4

4 回答 4

5

例如,您不应该在主线程上进行网络请求,尝试使用 AsyncTask 或启动新线程。

     (new Thread(new Runnable() {

                                        @Override
                                        public void run() {
                                            try {
                                                url = new URL(urlStr);
                                                java.net.URLConnection con = url.openConnection();
                                                con.connect();
                                                java.io.BufferedReader in =
                                                  new java.io.BufferedReader(new java.io.InputStreamReader(con.getInputStream()));
                                                String line;
                                                for (; (line = in.readLine()) != null; ) {
                                                    Log.d("MainActivity", "read from web "+line);
                                                }
                                            } catch (MalformedURLException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                            } catch (IOException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                            }

                                        }
                                    })).start();

或者你可以使用

    if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = 
             new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

检查问题以获取更多信息。

于 2013-01-23T12:26:52.953 回答
4

这是因为您试图从 Android 中不允许的主线程访问网络

您可以使用 AsyncTask 或创建另一个线程并在其中执行操作

如果您对如何使用 AsyncTask 或线程实现有任何疑问,请随时询问。如果你想要代码,请告诉我。

于 2013-01-23T12:23:37.607 回答
2

您正在 UI 线程中执行网络操作。这就是为什么你得到NetworkOnMainThreadException.

将您的代码更改为AsyncTask或将解决您的问题的线程。

于 2013-01-23T12:22:36.367 回答
2

NetworkOnMainThreadException:当应用程序尝试在其主线程上执行网络操作时引发的异常。

您应该在 asynctask 上调用 sendfeedback 方法,然后只有上面的代码才能工作。由于网络服务器需要大量时间来响应主线程变得无响应。为避免它,您应该在另一个线程上调用它。因此 asynctask 更好。

http://android-developers.blogspot.in/2009/05/painless-threading.html

这是说明如何使用 asynctask 的链接

于 2013-01-23T12:24:31.860 回答