標籤:android blog http io os ar java sp div
android程式串連網路出現android.os.NetworkOnMainThreadEx
錯誤:
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方法中添加下面的代碼,線程的方法還沒測試。
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads() .detectDiskWrites().detectNetwork().penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects() .detectLeakedClosableObjects().penaltyLog().penaltyDeath().build()); }
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中的違規等。
第二條語句設定了虛擬機器的一組監控策略,參數一致,因此不再贅述。 這樣,在保證了網路和磁碟訪問受控之後,主線程就允許我們對網路資源進行訪問。
android程式串連網路出現android.os.NetworkOnMainThreadEx