2013-01-23 112 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

相關問題