欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Caused by: android.os.NetworkOnMainThreadException错误解决办法

程序员文章站 2022-05-27 10:21:18
好久不写android代码手都生了,找出自己之前写的程序发现跑不了了,也没啥特别的错误提示,就看到一句有用的错误caused by: android.os.networko...

好久不写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);
  }
}