android无法连接到URL

时间:2013-01-23 12:21:03

标签: android url

我发现以下代码应该让我从网络主机(在这种情况下我的网站)中读取目录内容

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)但是当我在同一设备上使用网络浏览器并转到该网址时,它就会正常运行。

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

4 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分:4)

这是因为您尝试从Android

中不允许的主线程访问网络

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

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

答案 2 :(得分:2)

您正在UI线程中执行网络操作。这就是你得到NetworkOnMainThreadException的原因。

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

答案 3 :(得分:2)

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

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

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

这里是说明如何使用asynctask

的链接