從兩個方面說下這個問題:
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這個類來實現。 關於這個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);
這樣也可以解決這個問題
關於StrictMode的具體介紹,請看另一個博客介紹的非常詳細: