zoukankan      html  css  js  c++  java
  • 报android.os.NetworkOnMainThreadException错误

    问题描述:

     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()); 
  • 相关阅读:
    领域驱动设计(DomainDriven Design)
    Windows服务相关文档
    Attributes概述
    异步调用WebService方式!
    Msdn 杂志 asp.net ajax 文章汇集
    JavaScript
    常用数组效率比较
    Windows服务
    SOA实战
    Nunit使用方法
  • 原文地址:https://www.cnblogs.com/luoyaqi/p/4337537.html
Copyright © 2011-2022 走看看