Android4.0 以后不允许在主线程进行网络连接

Android4.0 以后不允许在主线程进行网络连接,否则会出现 android.os.NetworkOnMainThreadException。因此,必须另起一个线程进行网络连接方面的操作。

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.lujinhong.irmcdc.dao;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.Socket;  
  5. import java.net.UnknownHostException;  
  6. import java.util.Scanner;  
  7.   
  8. public class ResourceDao {  
  9.   
  10.     String returnLine = "hi";  
  11.   
  12.     public String getAllContentByName() {  
  13.         Runnable r = new NetWorkHandler();  
  14.         Thread thread = new Thread(r);  
  15.         thread.start();  
  16.   
  17.         try {  
  18.             Thread.sleep(15000);  
  19.         } catch (InterruptedException e) {  
  20.             e.printStackTrace();  
  21.         }  
  22.         return returnLine;  
  23.     }  
  24.   
  25.     private class NetWorkHandler implements Runnable {  
  26.   
  27.         String line = "line";  
  28.         Socket socket = null;  
  29.         Scanner scanner = null;  
  30.         @Override  
  31.         public void run() {  
  32.             try {  
  33.                 socket = new Socket("time-A.timefreq.bldrdoc.gov"13);  
  34.                 scanner = new Scanner(socket.getInputStream());  
  35.                 while (scanner.hasNextLine()) {  
  36.                     line = scanner.nextLine();  
  37.                     returnLine += line;  
  38.                 }  
  39.   
  40.             } catch (UnknownHostException e) {  
  41.                 e.printStackTrace();  
  42.             } catch (IOException e) {  
  43.                 e.printStackTrace();  
  44.             } finally {  
  45.                 scanner.close();  
  46.                 try {  
  47.                     socket.close();  
  48.                 } catch (IOException e) {  
  49.                     e.printStackTrace();  
  50.                 }  
  51.             }  
  52.         }  
  53.     }  
  54. }  


1、由于网络连接需要一定时间,为了在主界面上进行网络信息的展现,暂时用sleep()方法简单实现,使主线程等待网络信息读取完成。

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. Thread.sleep(5000);  

修改以下 问题,使用wai()及nofifyAll处理。

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.ljh.irmcdc.dao;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.Socket;  
  5. import java.net.UnknownHostException;  
  6. import java.util.Scanner;  
  7.   
  8. public class ResourceDao {  
  9.   
  10.     String returnLine = "";  
  11.   
  12.     public String getAllContentByName() {  
  13.         Runnable r = new NetWorkHandler();  
  14.         Thread thread = new Thread(r);  
  15.         thread.start();  
  16.            
  17.         synchronized (this) {  
  18.             try {  
  19.                 wait(20000);  
  20.             } catch (InterruptedException e) {  
  21.                 e.printStackTrace();   
  22.             }   
  23.         }  
  24.         return returnLine;  
  25.     }  
  26.   
  27.     private class NetWorkHandler implements Runnable {  
  28.   
  29.         String line = "line";  
  30.         Socket socket = null;  
  31.         Scanner scanner = null;  
  32.   
  33.         @Override  
  34.         public void run() {  
  35.             try {  
  36.                 // socket = new Socket("time-A.timefreq.bldrdoc.gov", 13);  
  37.                 socket = new Socket("192.168.136.44"8179);  
  38.                 scanner = new Scanner(socket.getInputStream());  
  39.                 returnLine = "";  
  40.                 while (scanner.hasNextLine()) {  
  41.                     line = scanner.nextLine();  
  42.                     returnLine += line;  
  43.                 }  
  44. <span style="white-space:pre">              </span>//不要直接使用this,否则nofity的对象不是上面wait所锁定的对象。  
  45.                 synchronized (ResourceDao.this) {  
  46.                     ResourceDao.this.notifyAll();  
  47.                 }  
  48.             } catch (UnknownHostException e) {  
  49.                 e.printStackTrace();  
  50.             } catch (IOException e) {  
  51.                 e.printStackTrace();  
  52.             } finally {  
  53.                 scanner.close();  
  54.                 try {  
  55.                     socket.close();  
  56.                 } catch (IOException e) {  
  57.                     e.printStackTrace();  
  58.                 }  
  59.             }  
  60.         }  
  61.     }  
  62. }  

注意:

1、在内部类中引用外部类对象的方法:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ResourceDao.this.notifyAll();  

2、wai()及nofity()必须放在synchronized块里面。

尤其注意在内部类中notify()外部类对象时,不要使用this,而应该是上述所表。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值