Android4.0 以后不允许在主线程进行网络连接 分类: H1_ANDROID 2013-10-09 14:32 2744人阅读 评论(0) 收藏
2013-10-09 14:32
615 查看
Android4.0 以后不允许在主线程进行网络连接,否则会出现 android.os.NetworkOnMainThreadException。因此,必须另起一个线程进行网络连接方面的操作。
1、由于网络连接需要一定时间,为了在主界面上进行网络信息的展现,暂时用sleep()方法简单实现,使主线程等待网络信息读取完成。
修改以下 问题,使用wai()及nofifyAll处理。
注意:
1、在内部类中引用外部类对象的方法:
2、wai()及nofity()必须放在synchronized块里面。
尤其注意在内部类中notify()外部类对象时,不要使用this,而应该是上述所表。
package com.lujinhong.irmcdc.dao; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; public class ResourceDao { String returnLine = "hi"; public String getAllContentByName() { Runnable r = new NetWorkHandler(); Thread thread = new Thread(r); thread.start(); try { Thread.sleep(15000); } catch (InterruptedException e) { e.printStackTrace(); } return returnLine; } private class NetWorkHandler implements Runnable { String line = "line"; Socket socket = null; Scanner scanner = null; @Override public void run() { try { socket = new Socket("time-A.timefreq.bldrdoc.gov", 13); scanner = new Scanner(socket.getInputStream()); while (scanner.hasNextLine()) { line = scanner.nextLine(); returnLine += line; } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { scanner.close(); try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
1、由于网络连接需要一定时间,为了在主界面上进行网络信息的展现,暂时用sleep()方法简单实现,使主线程等待网络信息读取完成。
Thread.sleep(5000);
修改以下 问题,使用wai()及nofifyAll处理。
package com.ljh.irmcdc.dao; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; public class ResourceDao { String returnLine = ""; public String getAllContentByName() { Runnable r = new NetWorkHandler(); Thread thread = new Thread(r); thread.start(); synchronized (this) { try { wait(20000); } catch (InterruptedException e) { e.printStackTrace(); } } return returnLine; } private class NetWorkHandler implements Runnable { String line = "line"; Socket socket = null; Scanner scanner = null; @Override public void run() { try { // socket = new Socket("time-A.timefreq.bldrdoc.gov", 13); socket = new Socket("192.168.136.44", 8179); scanner = new Scanner(socket.getInputStream()); returnLine = ""; while (scanner.hasNextLine()) { line = scanner.nextLine(); returnLine += line; } //不要直接使用this,否则nofity的对象不是上面wait所锁定的对象。 synchronized (ResourceDao.this) { ResourceDao.this.notifyAll(); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { scanner.close(); try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
注意:
1、在内部类中引用外部类对象的方法:
ResourceDao.this.notifyAll();
2、wai()及nofity()必须放在synchronized块里面。
尤其注意在内部类中notify()外部类对象时,不要使用this,而应该是上述所表。
相关文章推荐
- 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: 命名管 分类: 错误积累 2012-03-09 09:22 6511人阅读 评论(4) 收藏
- Android4.0 以后不允许在主线程进行网络连接
- Android4.0 以后不允许在主线程进行网络连接
- Android4.0 以后不允许在主线程进行网络连接
- Android4.0 以后不允许在主线程进行网络连接
- Android4.0 以后不允许在主线程进行网络连接
- Android4.0 以后不允许在主线程进行网络连接
- Android4.0 以后不允许在主线程进行网络连接
- Android中对手机文件进行读写 分类: H1_ANDROID 2013-10-23 22:48 512人阅读 评论(0) 收藏
- 使用无连接的数据报(UDP)进行通信 分类: Java 2015-07-27 20:59 13人阅读 评论(0) 收藏
- Android4.0 之后不允许在主线程进行网络连接
- 单例模式八种写法比较 2017-07-04 15:30 25人阅读 评论(0) 收藏 举报 分类: Android移动互联(19) 版权声明:本文为博主原创文章,未经博主允许不得转载。 目录
- 线程同步(信号量,互斥,条件变量) 分类: linux应用程序 2008-04-08 09:43 2587人阅读 评论(1) 收藏 举报 进行多线程编程,最头疼的就是那些共享的数据。因为你无法知道哪个线程会在哪个时候对它进行操作,你也无法
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法 分类: VC++ 2013-10-09 09:00 707人阅读 评论(0) 收藏
- 判断网络是否连接正常 分类: urllib2 2013-12-18 18:11 347人阅读 评论(0) 收藏
- Android使用蓝牙与PC端进行通信 分类: Android 2015-07-30 09:45 15人阅读 评论(0) 收藏
- 为什么说android UI操作不是线程安全的 分类: Android 2014-09-23 21:08 1357人阅读 评论(0) 收藏 举报 目录(?)[+] 可能在非UI线程中刷新界面的时候,U
- Android程序进行混淆,在导出签名a… 分类: Android开发 2014-05-30 10:58 47人阅读 评论(0) 收藏
- ASI通讯协议——ASI2x1 分类: 网络基础 2014-01-15 14:06 616人阅读 评论(0) 收藏
- adb常用命令 分类: H1_ANDROID 2013-09-08 15:22 510人阅读 评论(0) 收藏