Android之NetworkOnMainThreadException异常

原文链接:http://blog.csdn.net/mad1989/article/details/25964495   

点击阅读原文


------------------------------------------------------------------

看名字就应该知道,是网络请求在MainThread中产生的异常


先来看一下官网的解释:

Class Overview

The exception that is thrown when an application attempts to perform a networking operation on its main thread.

This is only thrown for applications targeting the Honeycomb SDK or higher. Applications targeting earlier SDK versions are allowed to do networking on their main event loop threads, but it's heavily discouraged. See the document Designing for Responsiveness.

Also see StrictMode.

http://developer.android.com/intl/zh-cn/reference/android/os/NetworkOnMainThreadException.html


解释一下,从Honeycomb SDK(3.0)开始,google不再允许网络请求(HTTP、Socket)等相关操作直接在Main Thread类中,其实本来就不应该这样做,直接在UI线程进行网络操作,会阻塞UI、用户体验相当bad!即便google不禁止,一般情况下我们也不会这么做吧~

所以,也就是说,在Honeycomb SDK(3.0)以下的版本,你还可以继续在Main Thread里这样做,在3.0以上,就不行了,建议


1,和network有关比较耗时的操作放到一个子线程里,然后用Handler消息机制与主线程通信。

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. public void onCreate(Bundle savedInstanceState) {  
  2.     super.onCreate(savedInstanceState);  
  3.     this.setContentView(R.layout.test);  
  4.     // 开启一个子线程,进行网络操作,等待有返回结果,使用handler通知UI  
  5.     new Thread(networkTask).start();  
  6. }  
  7.   
  8. Handler handler = new Handler() {  
  9.     @Override  
  10.     public void handleMessage(Message msg) {  
  11.         super.handleMessage(msg);  
  12.         Bundle data = msg.getData();  
  13.         String val = data.getString("value");  
  14.         Log.i("mylog""请求结果为-->" + val);  
  15.         // TODO  
  16.         // UI界面的更新等相关操作  
  17.     }  
  18. };  
  19.   
  20. /** 
  21.  * 网络操作相关的子线程 
  22.  */  
  23. Runnable networkTask = new Runnable() {  
  24.   
  25.     @Override  
  26.     public void run() {  
  27.         // TODO  
  28.         // 在这里进行 http request.网络请求相关操作  
  29.         Message msg = new Message();  
  30.         Bundle data = new Bundle();  
  31.         data.putString("value""请求结果");  
  32.         msg.setData(data);  
  33.         handler.sendMessage(msg);  
  34.     }  
  35. };  

2,使用异步机制如:asynctask,这个举个简单的加载网络图片的例子

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. class DownImage extends AsyncTask {  
  2.   
  3.     private ImageView imageView;  
  4.   
  5.     public DownImage(ImageView imageView) {  
  6.         this.imageView = imageView;  
  7.     }  
  8.   
  9.     @Override  
  10.     protected Bitmap doInBackground(String... params) {  
  11.         String url = params[0];  
  12.         Bitmap bitmap = null;  
  13.         try {  
  14.             //加载一个网络图片  
  15.             InputStream is = new URL(url).openStream();  
  16.             bitmap = BitmapFactory.decodeStream(is);  
  17.         } catch (Exception e) {  
  18.             e.printStackTrace();  
  19.         }  
  20.         return bitmap;  
  21.     }  
  22.   
  23.     @Override  
  24.     protected void onPostExecute(Bitmap result) {  
  25.         imageView.setImageBitmap(result);  
  26.     }  
  27. }  

3,直接在main Thread 进行网络操作的方法,网上给出的,我没有具体测试:

在发起Http请求的Activity里面的onCreate函数里面添加如下代码:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()  
  2.         .detectDiskReads().detectDiskWrites().detectNetwork()  
  3.         .penaltyLog().build());  
  4. StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()  
  5.         .detectLeakedSqlLiteObjects().detectLeakedClosableObjects()  
  6.         .penaltyLog().penaltyDeath().build());  


请记住,如果在Main Thread里声明了一个handler,这个handler所Post 的 Runnable(Thread)、以及处理的message都是在当前的mian线程里,非子线程。




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/538884.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中国信通院金融科技负责人韩涵:大数据是生产资料的变革,区块链是生产关系的变革...

在近日召开的“2018中国金融科技产业峰会”上,中国信息通信研究院主任工程师、金融科技负责人韩涵正式发布了《中国金融科技前沿技术发展趋势及应用场景研究报告》,详细讲解了A(人工智能)B(区块链)C&#x…

php mysql 拼音首字母,Mysql应用MySQL查询汉字的拼音首字母实例教程

《Mysql应用MySQL查询汉字的拼音首字母实例教程》要点:本文介绍了Mysql应用MySQL查询汉字的拼音首字母实例教程,希望对您有用。如果有疑问,可以联系我们。导读:最好的方法还是用 PHP 来取拼音首字母,在 MySQL 里新建一个字段来存放…

java简单纸牌游戏_活动回顾 | 畅玩法语纸牌游戏

11月17日下午,20级小伙伴们迎来了第二次法语角活动!这次外教Anne-Flore Vrac 老师为同学们安排了丰富有趣的法语纸牌游戏,快来一起回顾活动的精彩瞬间吧!集体游戏一:从1到30老师首先带领同学们进行了“从1到30”的小游…

人脸识别门禁_小区人脸识别门禁或取代传统门禁刷卡方式

可以说,社区是一个人口聚集的小型社会。首先社区的人流量很大,进出是十分频繁。其次,社区的大门以及各处进出口是业主与访客、外来人员等进进出出最关键的通道。因此,每个社区都会有一套成型的门禁系统,常见的是使用门…

Java Thread.join()详解

原文地址:http://www.open-open.com/lib/view/open1371741636171.html 点击阅读原文 ------------------------------------------------------------- 一、使用方式。 join是Thread类的一个方法,启动线程后直接调用,例如: Thr…

元类编程--property动态属性

from datetime import date, datetime class User:def __init__(self, name, birthday):self.name nameself.birthday birthdayself._age 0# def get_age(self):# return datetime.now().year - self.birthday.yearproperty #动态属性def age(self): #属性描述符&#x…

php什么情况下使用静态属性,oop-做php项目什么时候该使用静态属性呢

一般我们做php项目 类里面 定义的方法 或者 属性 都是普通的 什么时候该用 static 方法和属性 有什么例子的我很少用 静态属性 就有一次用过 我在做会员中心 要获取 会员菜单的时候 我用的private static $menu array();大家可以讨论下吗回复内容:一般我们做php项目…

vscode运行python文件_vscode怎么运行python文件

1、首先需要确保安装了VScode的Python插件,打开Python脚本,可以直接拖入,点击文件,点击首选项里的用户设置,这时候会用户设置配置文件。2、然后在左边文件CtrlF搜索Python关键字,找到pythonPath所在行3、然…

python输出日期语句_如何从Python的原始语句中提取时间-日期-时间段信息

经过几天的研究,我想出了以下方法来解决提取问题。在识别命题,然后识别月份并进行提取。在识别“-”,然后识别月份并进行提取。在部分代码如下所示。(节选,需要上下文中的依赖项)new_w new_s.split()for j in range(len(new_w)):…

datepicker动态初始化

datepicker 初始化动态表单的input,需要调用jquery的on方法来给未来元素初始化。 //对动态添加的时间文本框进行动态初始化$(table).on("focus", ".datepicker", function () {//添加data属性未来只初始化一次if ($(this).data("datepicke…

oracle中存储过程 =,oracle中的存储过程使用

一 存储过程的基本应用1 创建存储过程(SQL窗口)create or replace procedure update_staffasbeginupdate staff set name xy;commit;end update_staff;存储过程适合做更新操作,特别是大量数据的更新2 查看存储过程在数据字典中的信息(SQL窗口)select object_name,o…

python项目如何上线_django项目部署上线(示例代码)

前言完善的django项目上线,有很多种上线的方法,比如apache, uwsgi, nginx等。这里只介绍2种,一种是django自带的,另外一种则是nginx uwsgi完成介绍。这里的系统环境采用的是ubantu系统, python环境采用的是python3, d…

如何检查python的库是否安装成功_如何测试redis是否安装成功

下载Redis 下载好后 复制所在位置 cd 跳到 D:\Java\64bit 图中的目录位置 这样便启动成功了。 设置redis密码的话要 到redis.conf中找到 requirepass关键字 设置密码为123456 redis-cli.exe 进入客户端 然后 auth 123456 注释: auth 密码 set 对象名 [a] 值[123] ge…

第三方类库的学习心态

我们需要牢牢的记住:所有的第三方库能实现的功能,我们使用原生的API只要花时间和精力也能实现,但是可能会出现很多的bug而且会花费较多的时间和精力,而且性能也不一定很好,第三方的库会帮我们封装底层的一些代码&#…

HTTP返回码

响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行。响应码分五种类型,由它们的第一位数字表示:1.1xx:信息,请求收到,继续处理2.2xx:成功,行为被成功地接受、理…

oracle树结构统计,ORACLE 递归树型结构统计汇总

区域平台统计报表,省--市--区 汇总,还有各级医院,汇总与列表要在一个列表显示。用到ORACLE 会话时临时表 GLOBAL TEMPORARY TABLE ON COMMIT PRESERVE ROWS;递归树: START WITH P.PARENTORG ‘ROOT‘CONNECT BY PRIOR P.ORG…

我们真的需要使用RxJava+Retrofit吗?

原文:http://blog.csdn.net/TOYOTA11/article/details/53454925 点击阅读原文 RxJava详解:http://gank.io/post/560e15be2dca930e00da1083 Retrofit详解:http://www.tuicool.com/articles/AveimyQ --------------------------------------…

python ide如何运行_ide - 如何运行Python程序?

你问我很高兴! 我正在努力在我们的wikibook中解释这个问题(这显然是不完整的)。 我们正在与Python新手合作,并且必须通过您正在询问的内容帮助我们! Windows中的命令行Python: 使用编辑器中的“保存”或“另…

逻辑回归算法_算法逻辑回归

logistic回归又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘,疾病自动诊断,经济预测等领域。例如,探讨引发疾病的危险因素,并根据危险因素预测疾病发生的概率等。以胃癌病情分析为例&a…