2013-01-23 69 views
2

我发现下面的代码应该让我从一个虚拟主机读取的目录内容(我在这种情况下网站)机器人无法连接到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)的,但是当我在同一台设备上使用网络浏览器,并转到URL,它打开罚款。

我不是在丝网的东西非常好,可以有人请帮助,谢谢

+0

你可以在你的'AndroidManifest.xml'中添加相关的PERMISSION吗? – dumbfingers

回答

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问题以获取更多信息。

2

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

将您的代码更改为AsyncTask或其他可解决您问题的主题。

4

这是因为你正试图从没有在Android的

允许主线程访问网络

您可以使用的AsyncTask或创建另一个线程,并在其中

请随意执行操作询问您是否对使用AsyncTask或线程实现方法有任何疑问。请让我知道你是否想要代码。

+0

很好,谢谢,我知道关于asymc任务,所以我现在尝试 – steveh

+0

,所以我用新线程(new Runnable(){public void run(){CODE}}) m确定帮助,但现在我得到一个错误后lookHostByName java.lang.SecurityException:权限被拒绝(缺少INTERNET权限?)。我再次检查,我可以用浏览器打开该URL。 thx – steveh

+0

我尝试了一个类似的东西,通过创建一个新的类公共类DownloadFilesTask扩展AsyncTask ,并在doInBackground中尝试相同的代码和相同的问题。有任何想法吗?谢谢 – steveh

2

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

你应该叫sendfeedback方法上的AsyncTask那么只有上面的代码将正常工作。由于Web服务器花费大量时间响应主线程变得无法响应。为了避免它,你应该在另一个线程上调用它。因此,asynctask更好。

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

这里是链接,说明如何使用的AsyncTask

相关问题