zoukankan      html  css  js  c++  java
  • android.os.NetworkOnMainThreadException异常

    这个异常大概意思是在主线程访问网络时出的异常。 Android在4.0之前的版本 支持在主线程中访问网络,但是在4.0以后对这部分程序进行了优化,也就是说访问网络的代码不能写在主线程中了。
    那么如何做才能正常运行呢? 请看这里:

    例如:  从网络中获取一个Url地址。 

     

    1. url = AuthUtil.getAuthorizationURL();  
    2. if (url == null) {  
    3.     Toast.makeText(WebViewActivity.this, R.string.auth_url_empty, 3000).show();  
    4. }  


    如果直接写在主线程中的话 在2.x 版本中还是能运行 但是在4.0以后就会出现错误。

     

     

    网上也有很多相关资料比如说在主线程中添加

     

    1. // 详见StrictMode文档  
    2. StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()  
    3.         .detectDiskReads()  
    4.         .detectDiskWrites()  
    5.         .detectNetwork()   // or .detectAll() for all detectable problems  
    6.         .penaltyLog()  
    7.         .build());  
    8. StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()  
    9.         .detectLeakedSqlLiteObjects()  
    10.         .detectLeakedClosableObjects()  
    11.         .penaltyLog()  
    12.         .penaltyDeath()  
    13.         .build());  


    但是

     

    .detectLeakedClosableObjects()  会报错, 

    也就是说这个方法不用,但是查看源码发现其方法是公共的

     

     

    1. /** 
    2.              * Detect when an {@link java.io.Closeable} or other 
    3.              * object with a explict termination method is finalized 
    4.              * without having been closed. 
    5.              * 
    6.              * <p>You always want to explicitly close such objects to 
    7.              * avoid unnecessary resources leaks. 
    8.              */  
    9.             public Builder detectLeakedClosableObjects() {  
    10.                 return enable(DETECT_VM_CLOSABLE_LEAKS);  
    11.             }  


    这个我就有点搞不清楚怎么回事,资历尚浅还不会。哈哈。

     

    所以我就用第二种方法 也就是多线程,异步加载的方式加载数据。

    代码如下:

    在主函数中发送一个空的消息 :

    1. new Thread(){  
    2.             @Override  
    3.             public void run() {  
    4.                 // TODO Auto-generated method stub  
    5.                 super.run();  
    6.                 url = AuthUtil.getAuthorizationURL();  
    7.                 if (url == null) {  
    8.                     Toast.makeText(WebViewActivity.this, R.string.auth_url_empty, 3000).show();  
    9.                 }  
    10.                 handler.sendEmptyMessage(0);  
    11.             }  
    12.         }.start();  

     

    在handler中接受到消息 作出相应的处理。

     

    1. private Handler handler = new Handler() {  
    2.   
    3.         public void handleMessage(Message msg) {  
    4.             switch (msg.what) {  
    5.                 case 0:  
    6.                 <span style="white-space:pre">  </span>load(url, webView);  
    7.                     break;  
    8.             }  
    9.         };  
    10.     };  


    这样就解决的这个异常。

  • 相关阅读:
    Hibernate 基于外键的双向一对一关联映射
    Hibernate 基于外键的单项一对一关联映射
    Hibernate inverse
    Hibernate cascade
    Hibernate 双向一对多的关联映射
    Hibernate 单项一对多的关联映射
    (转)关闭iptables和SELinux
    linux下大于2T的硬盘格式化方法
    lsusb命令
    CentOS最小化安装后启用无线连接网络
  • 原文地址:https://www.cnblogs.com/qinweizhi/p/3501089.html
Copyright © 2011-2022 走看看