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…

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

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

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

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

元类编程--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…

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

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

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

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

使用docker搭建wordpress网站

概述 使用docker的好处就是尽量减少了环境部署,可靠性强,容易维护,我使用docker搭建wordpress的主要目标有下面几个首先我重新生成数据库容器可以保证数据库数据不丢失,重新生成wordpress容器保证wordpress网站数据不丢失&#xf…

XUtils之注解机制详解

原文:http://blog.csdn.net/rain_butterfly/article/details/37931031 点击阅读原文 ------------------------------------------------------ 这篇文章说一下xUtils里面的注解原理。 先来看一下xUtils里面demo的代码: [java] view plaincopy print?…

oracle ko16mswin949,mysql字符集 - osc_wq7ij8li的个人空间 - OSCHINA - 中文开源技术交流社区...

恰当的字符集,畅快的体验!00、Oracle字符集Subsets and Supersets #子集与超集Table A-11 Subset-Superset PairsSubset(子集)Superset(超集)AR8ADOS710AR8ADOS710TAR8ADOS720AR8ADOS720TAR8ADOS720TAR8ADOS720AR8APTEC715AR8APTEC715TAR8ARABICMACTAR…

曼彻斯特编码_两种编码方式以及两种帧结构

一、不归零制编码(Non-Return to Zero)对于不归零制编码是最简单的一种编码方式,正电平代表1,负电平代表0。如下图:其实在不归零制编码中有一个很明显的缺陷,那就是它不是自同步码。对于上图,你知道它传输的数据是什么…

Android快速开发框架XUtils

原文地址:http://blog.csdn.net/rain_butterfly/article/details/37812371 点击阅读原文 -------------------------------------------- https://github.com/wyouflf/xUtils https://github.com/wyouflf/xUtils3 XUtils是基于afinal开发的,比afina…

如何安装python3.8.1_python3.8.1 安装

Loading...请注意,本文编写于 217 天前,最后修改于 217 天前,其中某些信息可能已经过时。系统环境:centos 7 安装依赖项 bash yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-d…

明年新iphone使用增强版5nm芯片_苹果A15芯片或将采用台积电5nm+工艺!性能提升极强...

今年苹果的iPhone 12系列搭载的A14 仿生芯片是今年智能手机市场推出的第一款5nm工艺处理器,处理器的性能也是用户有目共睹的,相较于之前的芯片性能提升了一大截,有众多网友也表示:苹果芯片最大的敌人就是上一代的自己。当然&#…

怎么计算一组数据的波动_税控盘数据和小规模增值税申报表计算结果不一致怎么办...

a公司为小规模纳税人,于2020年1月申报2019年第四季度增值税时,是按照金税盘的数据实际销售金额为562,563,13元,实际销售税额为16,876.87元填写小规模纳税人增值税申报表。申报成功后,税务系统却跳出比对异常,户管员要求…

简单又好看的按钮,扁平化按钮。

原文地址:http://blog.csdn.net/peijiangping1989/article/details/19333779 点击阅读原文 ----------------------------------------------------------- 今天分享一下流行的扁平化按钮。完全不需要用到图片哦。效果图如下: 里面有2个按钮都是一样的…

执行 link.exe 时出错_在20多岁时应该做什么,以避免在30多岁和40多岁时后悔?...

1. 永远不要以为自己可以,将会或曾经到达过以为是错误的。无论是幸福,收入还是心态。在二十多岁的关键时期,我有这种心态,对我自己不利。认为自己“实现”是一种静态的世界观,阻碍了您的成长。接受这样的事实&#xff…

python绘制饼状图图例_使用matplotlib的所有饼图的通用图例

图例只需调用一次,否则将显示7个不同的图例。我在下面展示了一个例子。请注意,您必须将自己的数据替换为ax.pie():data1 (10,90) # some data to be plotted data2 (40,50) data3 (70,30) labels [Sending Data, Not Sending Data] #lege…

Android初始化本地数据库

原文:http://blog.csdn.net/itjavawfc/article/details/50860647 点击阅读原文 -------------------------------- 最近遇到一个需求,一个同学不会搭服务器,但是Android课程设计需要用到很多数据,这样就出现了一个问题&#xff0c…

hadoop临时文件 jar包_hadoop之Mapper/reducer源码分析之二

若当前JobClient (0.22 hadoop) 运行在YARN.则job提交任务运行在YARNRunnerHadoop Yarn 框架原理及运作机制主要步骤作业提交作业初始化资源申请与任务分配任务执行具体步骤在运行作业之前,Resource Manager和Node Manager都已经启动,所以在上图中&#…