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); } }
推荐阅读
-
IE发生内部错误 窗口被关闭的问题的解决办法
-
Android Caused by: java.lang.ClassNotFoundException解决办法
-
webpack之命令行打包错误解决办法
-
打开土豆看视频的时候提示错误代码cp0001的五种解决办法
-
pip 错误unused-command-line-argument-hard-error-in-future解决办法
-
Linux 出现telnet: 127.0.0.1: Connection refused错误解决办法
-
Docker daemon 无法启动: does not match with stored UUID错误解决办法
-
打印机测试错误 原因administrator解决办法
-
linux系统 配置DataGuard时报ORA-12528错误的解决办法
-
浏览器输入验证码总是出现错误的三种解决办法