Android4.0 主線程不能訪問網絡異常解決辦法

從兩個方面說下這個問題:

1. 不讓訪問網絡的緣由html

2. 解決該問題的辦法java

不讓訪問網絡的緣由:

因爲對於網絡情況的不可預見性,頗有可能在網絡訪問的時候形成阻塞,那麼這樣一來咱們的主線程UI線程 就會出現假死的現象,產生很很差的用戶體驗。因此,默認的狀況下若是直接在主線程中訪問就報出了這個異常,名字是NetworkOnMainThreadException網絡

解決該問題的辦法

1. 獨立線程異步

2. 異步線程AsyncTaskide

3. StrictMode修改默認的策略ui

1) 獨立線程的辦法

啓動一個新線程的代碼:
new Thread(){線程

@Overridehtm

public void run() {對象

Dosomething();blog

handler.sendEmptyMessage(0);

}

}.start();

此處咱們重寫了線程類的run方法,執行Dosomething. 在裏面還有個handler對象,這又涉及到了跨線程修改UI元素內容的問題。在java中是不容許跨線程修改UI元素的,如咱們在新啓動的線程中想去修改UI主線程中TextView的文本時,會報錯誤的。若是想作這樣的操做,咱們就得藉助Handler這個類來實現。 關於這個handler類的用法,咱們單獨的再來寫一篇博客進行介紹。

2) 異步調用的方法 AsyncTask

這裏關於AsyncTask 介紹的文章不錯, 詳細狀況看做者的介紹吧  
http://www.cnblogs.com/dawei/archive/2011/04/18/2019903.html#2824345
接下來也將會有一篇博客專門介紹 關於更新主線程UI線程的全部辦法

3) StrictMode修改默認的策略

在咱們的Activity類的onCreate方法中,設置以下規則:
StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

或者:

if (Build.VERSION.SDK_INT >= 11) {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads ().detectDiskWrites().detectNetwork().penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
}

 

這樣也能夠解決這個問題

關於StrictMode的具體介紹,請看另外一個博客介紹的很是詳細:

http://hb.qq.com/a/20110914/000054.htm

相關文章
相關標籤/搜索