Android4.0 以后不允许在主线程进行网络连接
2013-10-09 14:32
197 查看
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,而应该是上述所表。
相关文章推荐
- Android4.0 以后不允许在主线程进行网络连接 分类: H1_ANDROID 2013-10-09 14:32 2744人阅读 评论(0) 收藏
- Android4.0 以后不允许在主线程进行网络连接
- Android4.0 以后不允许在主线程进行网络连接
- Android4.0 以后不允许在主线程进行网络连接
- Android4.0 以后不允许在主线程进行网络连接
- Android4.0 以后不允许在主线程进行网络连接
- Android4.0 以后不允许在主线程进行网络连接
- Android4.0 之后不允许在主线程进行网络连接
- android4.0 HttpClient 以后不能在主线程发起网络请求
- 在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: SQL 网络接口, error: 26 - 定位指定的服务器/实例时出错)
- android 子线程进行网络连接等操作-AsyncTask方法
- android4.0以上访问网络不能在主线程中进行以及在线程中操作UI的解决方法
- 错误:在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: SQL 网络接口, error: 26 - 定位指定的服务器/实例时出错) 解
- android4.0 HttpClient 以后不能在主线程发起网络请求
- (转)在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: SQL 网络接口, error: 26 - 定位指定的服务器/实例时出错)
- 在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: SQL 网络接口, error: 26 - 定位指定的服务器/实例时出错)
- 使用黑莓8900通过蓝牙连接华为交换机进行现场网络配置与操作(一)
- Android 4.0以后不能在主线程能进行网络访问
- SQL Server不允许进行远程连接的解决办法
- 没有任何关闭socket的日志,客户端和服务端进程都在, 网络连接完好, 为什么进行某操作后好好的tcp连接莫名其妙地断了呢?