android.os.NetworkOnMainThreadException 異常處理



項目是2.1開發 測試手機是android4.0時候提示 android.os.NetworkOnMainThreadException異常

出錯誤地方是訪問網絡的webservice有問題

在網上找了半天說是用

@Override
protected void onCreate(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
String strVer=GetVersion.GetSystemVersion();
strVer=strVer.substring(0,3).trim();
float fv=Float.valueOf(strVer);
if(fv>2.3)
{
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // 這裏可以替換爲detectAll() 就包括了磁盤讀寫和網絡I/O
.penaltyLog() //打印logcat,當然也可以定位到dropbox,通過文件保存相應的log
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects() //探測SQLite數據庫操作
.penaltyLog() //打印logcat
.penaltyDeath()
.build());
}
super.onCreate(savedInstanceState);

}

代碼注意 StrictMode是2.3以上版本纔有的沒辦法我又把項目升級成2.3

但這樣做2.3以下版本安裝完成後打開後就報錯,在調用StrictMode之前做了下版本判斷

 從 Android 2.3 開始提供了一個新的類 StrictMode,該類可以用於捕捉髮生在應用程序主線程中耗時的磁盤、網絡訪問或函數調用,可以幫助開發者改進程序,使主線程處理 UI 和動畫在磁盤讀寫和網絡操作時變得更平滑,避免主線程被阻塞。

 

給 Android 應用開發者的十個建議

android.os.Build.VERSION.RELEASE;返回當前系統版本

以上問題可以解決。

 

注意:造成這樣的錯誤原因是代碼不符合Android規範,如果把上面訪問方式改爲異步操作就不會出現在4.0上訪問出現 android.os.NetworkOnMainThreadException異常

 如:

new Thread(){
@Override
public void run(){
//你要執行的方法
//執行完畢後給handler發送一個空消息
handler.sendEmptyMessage(0);
}
}.start();

 

//定義Handler對象
private Handler handler =new Handler(){
@Override
//當有消息發送出來的時候就執行Handler的這個方法
public void handleMessage(Message msg){
super.handleMessage(msg);
//處理UI
}
};

 

可以考慮用Volley  http://www.cnblogs.com/freexiaoyu/p/3446028.html

Google I/O 2013上,Volley發佈了。Volley是Android平臺上的網絡通信庫,能使網絡通信更快,更簡單,更健壯。

原文地址:http://www.cnblogs.com/freexiaoyu/archive/2012/04/13/2445707.html

發佈了30 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章