昨天和女朋友换了手机,我的iPhone 4S 换了她得三星I9003。第一感觉就是好卡,果断刷机。以前是Android 2.3的系统。回来刷成了4.4。

好了,问题来了。在我用手机测试我们的APP的时候,抛出一个如题的异常:android.os.NetworkOnMainThreadException

第一次看到这异常,字面意思是说:在主线程中的网络异常。然后我就去了解了下这个异常,先看看官方的说明:

public class

NetworkOnMainThreadException

extends RuntimeException

java.lang.Object
   ↳ java.lang.Throwable
     ↳ java.lang.Exception
       ↳ java.lang.RuntimeException
         ↳ android.os.NetworkOnMainThreadException

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.

所以事情就很清楚了。一个APP如果在主线程中请求网络操作,将会抛出此异常。Android这个设计是为了防止网络请求时间过长而导致界面假死的情况发生。

解决方案有两个,一个是使用StrictMode,二是使用线程来操作网络请求。

第一种方法:简单暴力,强制使用,代码修改简单(但是非常不推荐)
在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中做HTTP请求,不用阻塞UI线程。

public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.setContentView(R.layout.main_view);new Thread(runnable).start();
}Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);Bundle data = msg.getData();String val = data.getString("value");Log.i(TAG,"请求结果:" + val);}
}Runnable runnable = new Runnable(){@Overridepublic void run() {// TODO: http request.Message msg = new Message();Bundle data = new Bundle();data.putString("value","请求结果");msg.setData(data);handler.sendMessage(msg);}
}

上面是比较通用的方法,我的代码:

// Android 4.0 之后不能在主线程中请求HTTP请求new Thread(new Runnable(){@Overridepublic void run() {cachedImage = asyncImageLoader.loadDrawable(imageUrl, position);imageView.setImageDrawable(cachedImage);}}).start();

好了今天这个破事就到这里,其实android开发就这么点破事。关于其他破事,见专栏:

更多Android开发的破事,请看专栏:《Android开发那点破事》

【Android开发那点破事】解决android.os.NetworkOnMainThreadException相关推荐

  1. [Android开发那点破事]解决android.os.NetworkOnMainThreadException

    昨天和女朋友换了手机,我的iPhone 4S 换了她得三星I9003.第一感觉就是好卡,果断刷机.以前是Android 2.3的系统.回来刷成了4.4. 好了,问题来了.在我用手机测试我们的APP的时 ...

  2. 【Android开发那点破事】打开APP加载页面实现

    今天的破事呢就说说APP加载页面的实现.一般情况下,当APP打开的时候,我们需要做很多事情,比如检查网络连接啊,初始化一些配置啊等等.我们可以让这些事情在APP完全打开之前做完,然后呢在打开的过程中显 ...

  3. Android开发经验谈-很少有人会告诉你的Android开发基本常识,经验谈android

    转载:http://www.android100.org/html/201507/15/165084.html Android开发经验谈-很少有人会告诉你的Android开发基本常识,经验谈andro ...

  4. Android开发— 2016_最流行的Android组件、工具、框架大全(二)

    2019独角兽企业重金招聘Python工程师标准>>> 泡在网上的日子 首页 代码 话题 问答 标签 关于 登录注册 首页 › 安卓开发 › android开发 Android开发- ...

  5. Android开发-AMD平台如何使用Android studio自带模拟器

    Android开发-AMD平台如何使用Android studio自带模拟器 前言 AMD开启虚拟化VT win10专业版开启 win10家庭版开启 创建Android模拟器 前言 现在Android ...

  6. Android开发入门与实战之Android应用安装卸载

    当一个Android开发者完整的开发完毕一个程序应用软件结束后要进行软件测试,这就是软件测试员的来历,那么在这之前,要进行Android开发应用的安装与卸载. Android开发入门与实战之Andro ...

  7. Android 开发艺术探索——第十章 Android的消息机制

    Android 开发艺术探索--第十章 Android的消息机制读书笔记 Handler并不是专门用于更新UI的,只是常被用来更新UI 概述 Android的消息机制主要值得就是Handler的运行机 ...

  8. Xamarin.Android开发及常见问题的解决

    一.Xamarin.Android开发环境的搭建 (一)所需组件 1.VS2013(VS2010以上即可) 2.JDK(http://www.oracle.com/technetwork/java/j ...

  9. 阿里P7面试官告诉你:3-5年以上的Android开发如何深入进阶?Android中高级开发必须掌握哪些?

    前言 Android确实不是当年盛况,已经不再像前几年前那么火爆.一个新行业如果经历过盛极一时,那么必然有这样的一条曲线,像我们学的正弦曲线先急速上升,然后到达顶点,然后再下降,最后再趋近一个平稳的值 ...

最新文章

  1. 日常安排php,PHP日常开发小技巧
  2. VC++ 6.0 中如何使用 CRT 调试功能来检测内存泄漏[转]
  3. 潘淳(寒树Office):不务正业的公众号满月了,都写了些啥?
  4. 走过20年……你出现在哪里?
  5. jQuery源码分析--Event模块(1)
  6. 8运行不了_民航局暂停运行737max8,分析可能因为“它”导致飞机俯冲坠落
  7. [leetcode]169. 多数元素
  8. python logging打印终端_python中那些小众但有用的自带标准库
  9. EasyUI整站示例系统-SyPro
  10. 都要2022年了,你还在纠结pytorch还是tensorflow?
  11. Vue 中使用 codemirror
  12. 网页中那些遇到过的导航选中状态actived selected
  13. 尚学堂视频笔记五:IO流
  14. 字符串str.format()方法的个人整理
  15. MATLAB算法实战应用案例精讲-【深度学习】扩散模型(DM)(补充篇)
  16. VC6link卡死解决办法
  17. 全球光刻机龙头是怎样炼成的
  18. Hadoop基础教程-第12章 Hive:进阶(12.3 HiveServer2)(草稿)
  19. Unity Execution failed for task ‘:launcher:signReleaseBundle‘
  20. 圣诞夜表白代码!看你答不答应

热门文章

  1. 备份恢复--图形工具
  2. C++ 中ACSII字符集和Unicode字符集转换
  3. 试试这三个黑科技APP,带给你不一样的体验
  4. java jacob语音合成_Java使用Jacob调用SAPI合成语音
  5. C/C++Zlib 解压文件
  6. 对于Uncaught TypeError: Cannot set property ‘innerHTML‘ of null 的理解
  7. 科技的成就(四十四)
  8. 怎样呵护友谊_友情应该如何的呵护?
  9. 龙德广场爱心公益行,走进昌平区流村孤儿院
  10. 信息学奥赛_1000_ 入门测试题目