您的位置:首页 > 移动开发 > Android开发

报android.os.NetworkOnMainThreadException错误

2015-03-14 14:42 411 查看
问题描述:

1、当前的项目用的是4.3,经过断点调试,知道错误发生在

HttpURLConnection con = (HttpURLConnection)url.openConnection();//打开一个connection连接
con.setRequestMethod("GET");
con.setConnectTimeout(5000);

//得到服务器返回来的流
InputStream is = con.getInputStream();//错误抛出的地方


并报出如下错误:

  03-14 14:27:38.428: W/System.err(30191): android.os.NetworkOnMainThreadException

  03-14 14:27:38.429: W/System.err(30191): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1134)

解决:

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

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

线程中了。

网上相关资料得知,在主线程中添加如下代码即可解决:

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());
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: