android.os.NetworkOnMainThreadException

此内容转载与 http://fariytale.iteye.com/blog/1293530

 

 

  1. public void onCreate() {  
  2.   
  3.    if (DEVELOPER_MODE) {   
  4.        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() //构造StrictMode  
  5.   
  6.                .detectDiskReads() //当发生磁盘读操作时输出  
  7.   
  8.                .detectDiskWrites()//当发生磁盘写操作时输出  
  9.   
  10.                .detectNetwork()  //访问网络时输出,这里可以替换为detectAll() 就包括了磁盘读写和网络I/O  
  11.   
  12.                .penaltyLog()  //以日志的方式输出  
  13.   
  14.                .build());  
  15.   
  16.        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()  
  17.   
  18.                .detectLeakedSqlLiteObjects() //探测SQLite数据库操作  
  19.   
  20.           .penaltyLog() //以日志的方式输出  
  21.   
  22.                .penaltyDeath()  
  23.   
  24.                .build());  
  25.   
  26.    }  
  27.   
  28.    super.onCreate();  

当触发策略中的操作时系统会打印出一条StrictMode日志,格式如下:

Java代码   
  1. 02-27 10:03:56.122: DEBUG/StrictMode(16210): StrictMode policy violation; ~duration=696 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=23 violation=2   
  2. 02 02-27 10:03:56.122: DEBUG/StrictMode(16210):     at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:745)    

 另外说明两点:

1.在android2.3版本直接在ui线程中访问网络会报错

2.ANR窗口会在程序阻塞或者耗时超过5秒的运算后弹出 

 

但是,在遇到低过2.3版本以下的就会报错!要设置如下

 if (Build.VERSION.SDK != null && ConvertUtil.NVL(Build.VERSION.SDK, 0) > 10) {

            try {

                android.os.StrictMode.setThreadPolicy(new android.os.StrictMode.ThreadPolicy.Builder()

                        .detectDiskReads()

                        .detectDiskWrites()

                        .detectNetwork()   // or .detectAll() for all detectable problems

                        .penaltyLog()

                        .build());

                android.os.StrictMode.setVmPolicy(new android.os.StrictMode.VmPolicy.Builder()

                        .detectLeakedSqlLiteObjects() //探测SQLite数据库操作

                        .penaltyLog() //打印logcat

                        .penaltyDeath()

                        .build());

            } catch (Exception e) {

                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.

            }

        }

你可能感兴趣的:(StrictMode)