1. 程式人生 > >android程序連接網絡錯誤 java net unknownhostexception unable to reso

android程序連接網絡錯誤 java net unknownhostexception unable to reso

網絡資源 host 它的 因此 soc 一個 16px isp xuni

從網上拿了一個android的天氣預報程序來學習,最後run的時候發現提示下面的錯誤:

按我的調試過程分2步,都是有關網絡訪問方面的問題。

第一個錯誤:

android.os.NetworkOnMainThreadException

at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
......

原因:是涉及到url操作的時候,訪問網絡不能在主程序中運行

解決:參考【http://geeksun.iteye.com/blog/1447708、http://kb.cnblogs.com/a/2311659/】

在Activity類的onCreate方法中添加下面的代碼,線程的方法還沒測試。

[html] view plaincopy
  1. public void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. setContentView(R.layout.main);
  4. StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads()
  5. .detectDiskWrites().detectNetwork().penaltyLog().build());
  6. StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects()
  7. .detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
  8. }

Android的官方文檔給出了這個類設置的目的:
StrictMode是一個系統提供的開發工具,用以檢測在開發過程中因為偶然的事故從而造成的系統潛在的問題,進而提示開發者對其進行修復。

StrictMode通常用於捕獲磁盤訪問或者網絡訪問中與主進程之間交互產生的問題,因為在主進程中,UI操作和一些動作的執行是最經常用到的,它們之間會產生一定的沖突問題。將磁盤訪問和網絡訪問從主線程中剝離可以使磁盤或者網絡的訪問更加流暢,提升響應度和用戶體驗。

顯然,大多數初學者在進行網絡開發時,會選擇將訪問網絡的代碼直接放到主進程中,由於和主進程的首要工作——UI交互——相矛盾,因此,必須設置一定的檢測機制,以保證系統運行的流暢,所有的異常都可以被檢測。

public static voidsetThreadPolicy(StrictMode.ThreadPolicy policy)
這個方法允許我們為當前應用設置一組線程運行策略機制。其中的參數是一個策略組(即一組策略)。
public static finalclass StrictMode.ThreadPolicy.Builder()
Builder是StrictMode中內嵌類ThreadPolicy的一個內嵌類,在此我們調用了它的默認構造方法。
detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build()

通過這種方式,我們設置了一組監控模式,我們要檢測磁盤的讀寫,網絡的訪問, Log中的違規等。

第二條語句設置了虛擬機的一組監控策略,參數一致,因此不再贅述。
這樣,在保證了網絡和磁盤訪問受控之後,主線程就允許我們對網絡資源進行訪問。

【參考http://www.2cto.com/kf/201205/129843.html】

第二個錯誤:

java.lang.nullpointerexception

第一種情況:android4.0中

java.net.unknownhostexception:unable to resolve host "www.google.com":no addree associated with hostname

debug跟蹤是在執行url操作url.openStream()時拋出IOException異常。

第二種情況:android2.2中

java.net.SocketException: Permission denied

........

debug跟蹤是在執行url操作url.getInputStream()時拋出IOException異常。

從網上搜索了一下,發現有兩個方法:

1、添加dns,參考【http://interzb.iteye.com/blog/1240835】,經測試無效,不是這個原因

Run Configurations...或者Debug Configurations...打開下面的窗口,在對應項目的Target欄目最後行設置dns

技術分享圖片

2、Manifest文件沒有標明網絡訪問權限,測試正常,解決問題

如果確認網絡已經正常連接,還出現這個問題,那麽看一下Manifest文件是否標明了應用的網絡訪問權限;如果沒有標明,就訪問不了網絡,就會有這個錯誤。

在AndroidManifest.xml文件中添加下面的語句:

//<uses-sdk android:minSdkVersion="15" />//在這行後面

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

參考【http://blog.csdn.net/murongshusheng/article/details/7623188】

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!http://www.captainbed.net

android程序連接網絡錯誤 java net unknownhostexception unable to reso