Caused by: android.os.NetworkOnMainThreadException错误解决办法
好久不写android代码手都生了,找出自己之前写的程序发现跑不了了,也没啥特别的错误提示,就看到一句有用的错误caused by: android.os.networkonmainthreadexception,查了下原因上在4.0之后在主线程里面执行http请求都会报这个错,大概是怕http请求时间太长造成程序假死的情况吧。
解决办法有两个思路,分别是:
第一种方法:直接忽视,强制使用(强烈不推荐,但是修改简单)
在mainactivity文件的setcontentview(r.layout.activity_main)下面加上如下代码
if (android.os.build.version.sdk_int > 9) { strictmode.threadpolicy policy = new strictmode.threadpolicy.builder().permitall().build(); strictmode.setthreadpolicy(policy); }
第二种方法:使用thread、runnable、handler (推荐使用)
在runnable中做http请求,不用阻塞ui线程~
public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); this.setcontentview(r.layout.share_mblog_view); new thread(runnable).start(); } handler handler = new handler(){ @override public void handlemessage(message msg) { super.handlemessage(msg); bundle data = msg.getdata(); string val = data.getstring("value"); log.i("mylog","请求结果-->" + val); } } runnable runnable = new runnable(){ @override public void run() { // // todo: http request. // message msg = new message(); bundle data = new bundle(); data.putstring("value","请求结果"); msg.setdata(data); handler.sendmessage(msg); } }
附:另一篇解决方案
android 4.1项目:使用新浪微博分享时报:
android.os.networkonmainthreadexception
网上搜索后知道是因为版本问题,在4.0之后在主线程里面执行http请求都会报这个错,也许是怕http请求时间太长造成程序假死的情况吧。那么网上的朋友也给出了相应的解决方案,这叫上有政策下有对策:
一:在发起http请求的activity里面的oncreate函数里面添加如下代码:
//详见strictmode文档 strictmode.setthreadpolicy(new strictmode.threadpolicy.builder().detectdiskreads(). detectdiskwrites().detectnetwork().penaltylog().build()); strictmode.setvmpolicy(new strictmode.vmpolicy.builder().detectleakedsqlliteobjects(). detectleakedclosableobjects().penaltylog().penaltydeath().build());
如果正在做的项目不是android 4.0的是看不到strictmode类的。我也是用的网上给的com_weibo_android.jar。但是这个jar包下载下来的时候是2.3的,要先转换成android 4.0的项目,再在分享对应的shareactivity的oncreate()函数中添加上面的两行代码。这样就不会报这个错误了。
二:使用thread、runnable、handler这三个类:
public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); this.setcontentview(r.layout.share_mblog_view); new thread(runnable).start(); } handler handler = new handler(){ @override public void handlemessage(message msg) { super.handlemessage(msg); bundle data = msg.getdata(); string val = data.getstring("value"); log.i("mylog","请求结果为-->" val); } } runnable runnable = new runnable(){ @override public void run() { // // todo: http request. // message msg = new message(); bundle data = new bundle(); data.putstring("value","请求结果"); msg.setdata(data); handler.sendmessage(msg); } }
推荐阅读
-
wordpress4.1中文标签出现404错误的解决办法
-
qqlogin.exe是什么进程 qqlogin.exe应用程序错误解决办法
-
IE发生内部错误 窗口被关闭的问题的解决办法
-
详解@Vue/Cli 3 Invalid Host header 错误解决办法
-
东莞农村商业银行网页错误无法登录的解决办法
-
会声会影X5安装失败CRC错误怎么办 安装不了解决办法
-
Android Data Binding 在 library module 中遇到错误及解决办法
-
笔记本开机进不去系统 错误代码0xc000000f的解决办法
-
卸载金山快盘后出现encrypteddisk错误的解决办法详解
-
更新iTunes出现错误怎么办 iTunes更新出现错误现象的解决办法