看名字就应该知道,是网络请求在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消息机制与主线程通信。

    public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.test);
// 开启一个子线程,进行网络操作,等待有返回结果,使用handler通知UI
new Thread(networkTask).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);
// TODO
// UI界面的更新等相关操作
}
}; /**
* 网络操作相关的子线程
*/
Runnable networkTask = 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);
}
};

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

class DownImage extends AsyncTask {

    private ImageView imageView;

    public DownImage(ImageView imageView) {
this.imageView = imageView;
} @Override
protected Bitmap doInBackground(String... params) {
String url = params[];
Bitmap bitmap = null;
try {
//加载一个网络图片
InputStream is = new URL(url).openStream();
bitmap = BitmapFactory.decodeStream(is);
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
} @Override
protected void onPostExecute(Bitmap result) {
imageView.setImageBitmap(result);
}
}

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

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

        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads().detectDiskWrites().detectNetwork()
.penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects().detectLeakedClosableObjects()
.penaltyLog().penaltyDeath().build());

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

Android NetworkOnMainThreadException异常的更多相关文章

  1. android.os.NetworkOnMainThreadException异常

    在android4.0以前,访问网络的代码可以写在UI主线程,但是在android4.0以上就不能在ui主线程中访问网络了,会出现android.os.NetworkOnMainThreadExcep ...

  2. Android Eclipseproject开发中的常见调试问题(二)android.os.NetworkOnMainThreadException 异常的解决的方法

    android.os.NetworkOnMainThreadException 异常的解决的方法. 刚开是把HttpURLConnectionnection 打开连接这种方法放在UI线程里了,可能不是 ...

  3. 安卓开发解决android.os.NetworkOnMainThreadException异常方法(主线程不能直接调用webservice)

    安卓开发解决android.os.NetworkOnMainThreadException异常方法 2013-01-07 14:01:04|  分类: 技术 |  标签:安卓  技术  java  | ...

  4. Android加载网络图片报android.os.NetworkOnMainThreadException异常

    Android加载网络图片大致可以分为两种,低版本的和高版本的.低版本比如4.0一下或者更低版本的API直接利用Http就能实现了: 1.main.xml <?xml version=" ...

  5. Android编译异常` Cause: duplicate entry: META-INF/MANIFEST.MF`

    目录 Android编译异常Cause: duplicate entry: META-INF/MANIFEST.MF 解决方案2: 治标又治本(暂无) 解决方案1: 治标不治本(还原大法) 参考资料 ...

  6. Android之NetworkOnMainThreadException异常

    看名字就应该知道,是网络请求在MainThread中产生的异常 先来看一下官网的解释: Class Overview The exception that is thrown when an appl ...

  7. 【转】Android之NetworkOnMainThreadException异常

    看名字就应该知道,是网络请求在MainThread中产生的异常 先来看一下官网的解释: Class Overview The exception that is thrown when an appl ...

  8. Android记录10--android.os.NetworkOnMainThreadException异常解决办法

    2013年11月1日小光棍节 有一段时间没有发表新的博客了,最近一直在忙着开发新浪微博客户端遇到很多问题比较头痛,比如说本篇博客要讲的NetworkOnMainThreadException这个异常, ...

  9. 【Android 错误记录】android.os.NetworkOnMainThreadException 异常问题

    最近自己学习开发一个小app,想根据网络来判断一些逻辑,但是运行应用时遇到了这个错误 android.os.NetworkOnMainThreadException 后来,查询了一些信息,发现原因就是 ...

随机推荐

  1. layout-代码中添加view

    今天需要在代码中动态的给一个布局添加一个imageview,现在把方法记录如下.直接看demo代码 //创建容器 final LinearLayout layout = new LinearLayou ...

  2. Vue v-if v-for v-bind v-on

    v-if <div v-if="type === 'A'"> A </div> <div v-else-if="type === 'B'&q ...

  3. android 图片特效处理之 图片叠加

    这篇将讲到图片特效处理的图片叠加效果.跟前面一样是对像素点进行处理,可参照前面的android图像处理系列之七--图片涂鸦,水印-图片叠加和android图像处理系列之六--给图片添加边框(下)-图片 ...

  4. js --- return返回值 闭包

    什么是闭包?这就是闭包! 有权访问另一个函数作用域内变量的函数都是闭包.这里 inc 函数访问了构造函数 a 里面的变量 n,所以形成了一个闭包. function a(){ var n = 0; f ...

  5. 虚拟局域网(VLAN)技术在企业网管理中的应用

    虚拟局域网(VLAN)技术在企业网管理中的应用 1.VLAN介绍     所谓VLAN 是指处于不同物理位置的节点根据需要组成不同的逻辑子网,即一个VLAN 就是一个逻辑广播域,它可以覆盖多个网络设备 ...

  6. java体系学习

    前端部分: 1)HTML:网页的核心语言,构成网页的基础 2)CSS:使网页更加丰富多彩灿烂的利器 3)JavaScript:使网页动起来的根本,加强了网页和用户之间的交互 4)HTML DOM:换一 ...

  7. ajax起步 (二)

    Ajax的关键在于XMLHttpRequest对象,如下基本用法: <!DOCTYPE html> <html> <head> <meta charset=& ...

  8. 【习题 8-4 UVA - 11491】Erasing and Winning

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 考虑删掉第i位. 则第i+1位就会取代第i位. 则肯定第i+1位比第i位大的话,才比较好. 则从小到大贪心删,找到第一个a[i+1] ...

  9. Apache-DBUtils包对数据库的操作

    •commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装.学习成本极低.而且使用dbutils能极大简化jdbc编码的工作量,同一时候也不会影 ...

  10. codecombat之边远地区的森林12-22关及地牢39关代码分享

    codecombat中国游戏网址:http://www.codecombat.cn/ 全部代码为javascript代码分享 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...