问题描述:
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());