今天在学习的过程中遇到了NetworkOnMainThread的异常,关于这个异常问题在android sdk 4.0版本上,这个问题可能比较常见,查了许些资料大多都是大概讲解原因,但是没有讲解到具体的解决方法,下面将我写的程序的时候的解决方法记录如下:
首先看看LogCat的异常信息:
异常的原因:在android3.0版本开始就强制不能在主线程中访问网络,要把访问网络放在独立的线程中。在开发中,为了防止访问网络阻塞主线程,一般都要把访问网络放在独立线程中或者异步线程AsyncTask中。
也就是说解决NetworkOnMainThread异常有两种方案:
第一种:重新开一个线程。
第二种:忽略这些强制策略
而在我是在学习的过程中,没有那么限制需要考虑就采用了第二种解决方案,忽略这些强制策略问题,要忽略策略问题可以在onCreate()方法里面加上
StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy);
同事在类的上面加上@SuppressLint("NewApi"),这样问题就解决了,程序也能够顺利通过运行。
在上面解决方案中提到了StrictMode类,这个类是在android sdk 2.3以上才有StrictMode类。说到这里那么我来简要说明下StrictMode类:
StrictMode类是在Android 2.3提供一个称为严苛模式(StrictMode)的调试特性。那它都做什么呢?它将报告与线程及虚拟机相关的策略违例。一旦检测到策略违例(policy violation),你将获得警告,其包含了一个栈trace显示你的应用在何处发生违例。可以强制用警告代替崩溃(crash),也可以仅将警告计入日志,让你的应用继续执行,就像我的程序解决方案就是强制忽略策略,强制执行。