Android开发的一小项目,访问WebService,访问网络时抛出这个异常:android.os.NetworkOnMainThreadException。原因是Android从4.0开始不能在Honeycombe的UI线程上执行网络IO,从技术上来说,早期的android版本可以,但是这个真的不是一个好方法,它会让你的app停止响应,而且可能会导致OS杀死你的app。你可能需要在一个后台线程中运行一个后台进程或者是用AsyncTask来执行你的网络事务。

异常:android.os.NetworkOnMainThreadException

分析:这个异常大概意思是在主线程访问网络时出的异常。 Android在4.0之前的版本 支持在主线程中访问网络,但是在4.0以后对这部分程序进行了优化,也就是说访问网络的代码不能写在主线程中了。

20130927230918

解决方法一:(2.3以下不能用)

从 Android 2.3 开始提供了一个新的类 StrictMode,该类可以用于捕捉发生在应用程序主线程中耗时的磁盘、网络访问或函数调用,可以帮助开发者改进程序,使主线程处理 UI 和动画在磁盘读写和网络操作时变得更平滑,避免主线程被阻塞。

[java]
//4.0不能在主线程中访问网络处理,StrictMode只在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());

[/java]

解决方法二:

[java]
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 启动线程执行下载任务
new Thread(downloadRun).start();
}

/**
* 下载线程
*/
Runnable downloadRun = new Runnable(){

@Override
public void run() {
// TODO Auto-generated method stub
updateListView();
}
};
[/java]

发表评论

/ 快捷键:Ctrl+Enter
加载中……