項目是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.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