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

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;@Overridepublic 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;@Overridepublic 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 以后不允许在主线程进行网络连接相关推荐

  1. Android 避免主线程执行网络请求之Activity/Fragment 结束后处理异步回调

    大家都知道Android涉及到与UI相关的操作只能在主线程执行 android4.0以后就禁止在主线程进行网络请求了,在主线程里面执行Http请求都会报NetworkOnMainThreadExcep ...

  2. Android强制在主线程进行网络请求

    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentVie ...

  3. android 4.0主线程访问网络问题

    在4.0以下,在主线程中访问网络,如果请求超过6s的话,就会报ANR,那么这就会带来一个问题,如果网络慢或者请求的数据过大时,界面会卡顿,造成界面灵敏性很差,因此网络请求一般不能放在主线程中操作,go ...

  4. Android 4主线程访问网络

    最近做一个Android项目,利用Jsoup读取和解析网页数据,同样的程序在Android2.3上运行完全正常,而跑到Android4上面,bug出现了... 看了一下异常:android.os.Ne ...

  5. android主线程访问网络的方法

    从两个方面说下这个问题: 1. 不让访问网络的原因 2. 解决该问题的办法 不让访问网络的原因: 由于对于网络状况的不可预见性,很有可能在网络访问的时候造成阻塞,那么这样一来我们的主线程UI线程 就会 ...

  6. 安卓HttpURLConnection 进行http请求(传递数据 获取数据 主线程禁止网络请求)以get方式为例

    注意: 1.安卓主线程禁止联网操作,如果在主线程中使用HttpURLConnection需通过new Thread()在新的线程中使用. 2.使用HttpURLConnection时必须设计异常处理. ...

  7. android不能在主线程,android.os.NetworkOnMainThreadException 在4.0之后谷歌强制要求连接网络不能在主线程进行访问(示例代码)...

    谷歌在4.0系统以后就禁止在主线程中进行网络访问了,原因是: 主线程是负责UI的响应,如果在主线程进行网络访问,超过5秒的话就会引发强制关闭, 所以这种耗时的操作不能放在主线程里.放在子线程里,而子线 ...

  8. 在非主线程中创建窗口

    很多朋友都会有过这样的经历,为什么在主线程中创建窗口且窗口工作很正常,但一移到非主线程(有的朋友喜欢叫它为工作线程),却无法正常工作.本文就这个问题和各位探讨,可能无法做到尽善尽美,但能抛砖引玉也算是 ...

  9. 主线程退出,子线程会退出吗?子线程崩溃,主线程会退出吗?

    记得以前刚接触多线程编程时,作为一个新手遇到的一个问题就是:我创建的子线程为什么没有跑起来?如以下最简单的一个程序: #include <stdio.h> #include <std ...

最新文章

  1. 获取保存在沙盒中plist文件的用户的字典信息
  2. 基于Python, Selenium, Phantomjs无头浏览器访问页面
  3. 【算法导论】插入排序
  4. 资金只够支撑10个月,自动驾驶致命事故重演:特斯拉陷入困境
  5. NYOJ 975 关于521
  6. 50个PHP程序性能优化的方法
  7. GitHub Copilot 现已登陆 Visual Studio!
  8. 整数去重(信息学奥赛一本通-T1117)
  9. golang java耗内存_分析golang内存占用情况
  10. Java 14 来了!
  11. UFLDL 教程学习笔记(二)反向传导算法
  12. 你真的会使用SQL Server的备份还原功能吗?之一:恢复模型
  13. C#中TransactionScope的使用小结
  14. android 6g 有必要吗,Android手机6GB内存有必要吗?实测出真知
  15. 青龙面板基本脚本运行必装依赖 一键式安装脚本安装依赖 2023年3月28日
  16. LeetCode/LintCode 题解丨一周爆刷字符串:旋转字符数组
  17. 使用萤石工作室采集视频流程以及萤石摄像头(C6、C8PF)、Sj6 Legend详解
  18. 单片机开发之数字温度计制作
  19. JAVA中intern()方法的详解
  20. ios 倒数器_PS制作苹果IOS7系统中的倒数计时器

热门文章

  1. 智能情绪分析技术_情绪转变令市场再次修正 Justforex:欧元、英镑、日元、黄金技术分析...
  2. MHA+LAMP+Keepalived实现高可负载均衡综合实验
  3. Visual Studio 如何创建C/C++项目
  4. SQL语句的添加、删除、修改多种方法
  5. android transfer error: Read-only file system
  6. c++ string 拼接_C++日志(二十五)字符数组、字符数组指针和string类
  7. java 图片导出_java导出含图片的word
  8. mysql微服务查询问题_微服务架构下,Mysql读写分离后,数据库CPU飙升卡壳问题解析...
  9. unity双面显示在哪_双面屏努比亚Z20售3499起 4800万三摄+855Plus+4K电池
  10. android app 主界面,android ViewPager实现App主界面Tab菜单页面切换和点击事件