Android主執行緒不能訪問網路異常解決辦法 NetworkOnMainThreadException錯誤
Android Activity主執行緒預設情況下不允許訪問網路
轉自http://www.cnblogs.com/lyroge/p/3837902.html
從兩個方面說下這個問題:
1. 不讓訪問網路的原因
2. 解決該問題的辦法
不讓訪問網路的原因:
由於對於網路狀況的不可預見性,很有可能在網路訪問的時候造成阻塞,那麼這樣一來我們的主執行緒UI執行緒 就會出現假死的現象,產生很不好的使用者體驗。所以,預設的情況下如果直接在主執行緒中訪問就報出了這個異常,名字是NetworkOnMainThreadException
解決該問題的辦法
1. 獨立執行緒
2. 非同步執行緒AsyncTask
3. StrictMode修改預設的策略
1) 獨立執行緒的辦法
啟動一個新執行緒的程式碼:
new Thread(){@Override
public void run() {
Dosomething();
handler.sendEmptyMessage(0);
}
}.start();
此處我們重寫了執行緒類的run方法,執行Dosomething. 在裡面還有個handler物件,這又涉及到了跨執行緒修改UI元素內容的問題。在java中是不允許跨執行緒修改UI元素的,如我們在新啟動的執行緒中想去修改UI主執行緒中TextView的文字時,會報錯誤的。如果想做這樣的操作,我們就得藉助Handler這個類來實現。 關於這個
2) 非同步呼叫的方法 AsyncTask
3) StrictMode修改預設的策略
在我們的Activity類的onCreate方法中,設定如下規則:
StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
這樣也可以解決這個問題
關於StrictMode的具體介紹,請看另一個部落格介紹的非常詳細: