【Android开发】解决安卓android.os.NetworkOnMainThreadException

解决android socket编程出现的Caused by: android.os.NetworkOnMainThreadException

本文转自:http://blog.csdn.net/debutent/article/details/8708127

 

以前我的socket通信的代码运行在android2.3.5手机上一点问题没有,现在入手了小米2S(系统android4.1.1)后,发现出现如下问题,期间server端打开后异常关闭,在logcat中查看到了Caused by: android.os.NetworkOnMainThreadException错误,在http://stackoverflow.com/questions/13136539/caused-by-android-os-networkonmainthreadexception找到了答案,要在MainActivity.javasetContentView(R.layout.activity_main)后加入以下代码

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. if (android.os.Build.VERSION.SDK_INT > 9) {      
  2. StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();      
  3. StrictMode.setThreadPolicy(policy);  
  4. }  

并在文件头加入,import android.os.StrictMode

问题解决

 

对于什么是StrictMode,可以参考http://www.cnblogs.com/zelos/archive/2011/02/27/1966403.html

 

还有一篇文章解释的更清晰:

android.os.NetworkOnMainThreadException异常,经过查文档,原来是4.0系统不允许主线程(UI线程)访问网络,因此导致了其异常。在4.0之后在主线程里面执行Http请求都会报这个错,也许是怕Http请求时间太长造成程序假死的情况吧。

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

//详见StrictMode文档

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());  
  2. StrictMode.setVmPolicy(newStrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());  

如果正在做的项目不是Android 4.0的是看不到StrictMode类的。

二:使用ThreadRunnableHandler这三个类:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public void onCreate(Bundle savedInstanceState)   
  2. {   super.onCreate(savedInstanceState);  
  3.     this.setContentView(R.layout.share_mblog_view);  
  4.      newThread(runnable).start();  
  5. }  
  6. Handler handler=newHandler(){  
  7. @Override  
  8. public void handleMessage(Message msg) {  
  9. super.handleMessage(msg);  
  10. Bundle data=msg.getData();  
  11. String val= data.getString("value");  
  12. Log.i("mylog","请求结果为-->" +val);  
  13. }  
  14. }  
  15. Runnable runnable=newRunnable(){  
  16. @Override  
  17. public void run() {  
  18. TODO: http request.//  
  19. Message msg =newMessage();  
  20. Bundle data=newBundle();  
  21. data.putString("value","请求结果");  
  22. msg.setData(data);  
  23. handler.sendMessage(msg);  
  24. }  
  25. }  

开线程处理关于网络的事物,然后用handler发送消息来处理更新UI

自己走了不少弯路。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值