2011-08-07 64 views
16

我的Android 3.1模擬器出現了一些問題。我無法獲取我的XML文件。Android http連接異常

protected InputStream getInputStream() { 
    try { 

     return feedUrl.openConnection().getInputStream(); 
    } catch (IOException e) { 
     throw new RuntimeException(e); 
    } 
} 

這裏的錯誤跟蹤:

08-07 22:34:26.657: ERROR/AndroidRuntime(563): Caused by: android.os.NetworkOnMainThreadException 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1077) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at java.net.InetAddress.lookupHostByName(InetAddress.java:477) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:277) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at java.net.InetAddress.getAllByName(InetAddress.java:249) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:69) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:48) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection$Address.connect(HttpConnection.java:304) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:89) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpConnection(HttpURLConnectionImpl.java:292) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConnection(HttpURLConnectionImpl.java:274) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.retrieveResponse(HttpURLConnectionImpl.java:1038) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:523) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at maps.test.BaseFeedParser.getInputStream(BaseFeedParser.java:30) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at maps.test.DomFeedParser.parse(DomFeedParser.java:23) 

我想我無法連接到互聯網,甚至<uses-permission android:name="android.permission.INTERNET"/>。但在同一時間,谷歌API工作得很好。

+0

的[android.os.NetworkOnMainThreadException(可能重複http://stackoverflow.com/questions/6343166/android -os-networkonmainthreadexception) – laalto

回答

52

產生的原因:android.os.NetworkOnMainThreadException

在蜂窩他們已經走了,放在一個陷阱捕捉人試圖做可能耗時網絡操作在主線程上。

來源:http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

當應用程序試圖在其主線程進行網絡操作時引發的異常。

這僅適用於定位到Honeycomb SDK或更高版本的應用程序。針對早期SDK版本的應用程序允許在其主要事件循環線程上進行聯網,但非常不鼓勵。請參閱文檔Designing for Responsiveness

另請參閱StrictMode

(請注意,你可以有瞬間發現這個自己做在您發佈的錯誤消息的頂部除了在網絡搜索。)

因爲事情喜歡找了一個主機名,可以採取時間長且有限,但不應從主線程上需要快速返回的事件函數(如在幾毫秒內)中調用它們。如果其中一個函數返回時間過長,Android將失去向程序發送消息的能力,並可能彈出令人畏懼的應用程序無響應對話框。

您應該將您的網絡操作(至少是任何需要等待結果或阻塞清除以便發送更多內容的操作)移動到線程。如果網絡操作來自一段API代碼,那麼你可能不應該在主線程中調用它。

+0

我收到相同的錯誤,但我有我的http工作在一個單獨的線程即異步任務。出了什麼問題?你能指導我嗎? –

+0

您可能沒有正確使用異步任務,並且沒有將所有網絡操作放在後臺方法中,或者從ui線程調用後臺方法,而不是啓動異步任務。當你檢查你的堆棧跟蹤時,你會發現哪一個。 –

+0

我仔細檢查過,http調用是從.execute()命令調用的doInBackground()方法中調用的,但該流仍返回:org.apache.harmony.luni.internal.net.www.protocol.http。 FixedLengthInputStream @ 405259f0 –

4

你有

<uses-permission android:name="android.permission.INTERNET" /> 

在你的Android清單?它應該是你的application標籤上面

+0

我已經添加了它,不要忘了我說google API工作得很好。 – oueslatibilel

+0

但您認爲Google API可以在沒有連接的情況下運行? beionause MyLocationOverlay不工作!但我可以查看在地圖和添加靜態疊加 <使用的許可機器人:名稱=「android.permission.INTERNET對」 /> – oueslatibilel

+0

嘗試移動應用上述的使用的許可標籤標籤,所以它是 Pikaling

3

此異常僅適用於定位到Honeycomb SDK或更高版本的應用程序。 你可能會針對您的SDK等於或低於API級別更高11.它只是改變爲低於11 API級別8或其他API級別您的問題可以得到解決

Here是同樣的問題,它已經被改變解決api級別。

我希望它可以幫助你。

+1

定位在11下面的api不起作用。 – logray

+1

實際上我理解它的方式,這個異常是爲了防止主線程上耗時的網絡操作而拋出的。所以問題不在於他瞄準的API,而在於他處理網絡操作的方式;) – AgentKnopf

0

從AndroidManifest中刪除android:targetSdkVersion「version_number」。XML

我刪除它,我的問題解決了

15

使用異步任務或

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

這對於各種快速評估都是一個很好的提示。線程/異步詳細信息不必浪費時間。謝謝! –