【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)后加入以下代码

if (android.os.Build.VERSION.SDK_INT > 9) {    
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();    
StrictMode.setThreadPolicy(policy);
}

并在文件头加入,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文档

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

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

二:使用ThreadRunnableHandler这三个类:

public void onCreate(Bundle savedInstanceState) 
{   super.onCreate(savedInstanceState);
    this.setContentView(R.layout.share_mblog_view);
     newThread(runnable).start();
}
Handler handler=newHandler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle data=msg.getData();
String val= data.getString("value");
Log.i("mylog","请求结果为-->" +val);
}
}
Runnable runnable=newRunnable(){
@Override
public void run() {
////TODO: http request.//
Message msg =newMessage();
Bundle data=newBundle();
data.putString("value","请求结果");
msg.setData(data);
handler.sendMessage(msg);
}
}

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

自己走了不少弯路。

相关文章
|
5天前
|
Java Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【7月更文挑战第8天】在移动应用开发的广阔天地中,Android与iOS两大平台各自占据着半壁江山。本文将深入探讨这两个平台在开发环境、用户界面设计、性能优化以及市场覆盖等方面的根本差异,并分析这些差异如何影响项目的成功。通过比较和分析,旨在为开发者在选择平台时提供更全面的视角,帮助他们根据项目需求和目标市场做出更明智的决策。
|
2天前
|
开发工具 Android开发 iOS开发
探索Android与iOS开发的差异与挑战
【7月更文挑战第11天】在移动应用开发的广阔天地中,Android和iOS两大平台如同双子星座般耀眼,各自拥有独特的开发生态和用户群体。本文将深入分析这两个平台的显著差异,从技术架构到开发工具,再到市场定位,揭示它们之间的异同。通过比较,我们不仅能够更好地理解各自的优势和局限,还能洞察未来移动应用开发的趋势。
|
3天前
|
开发者 Kotlin Android开发
Kotlin协程在Android开发中的应用
【7月更文挑战第10天】Kotlin协程简化了Android异步编程,提供轻量级并发。挂起函数让异步代码看起来同步,不阻塞线程,便于管理。在项目中,添加Kotlin和协程依赖,如`kotlinx.coroutines-core`和`kotlinx-coroutines-android`。使用`CoroutineScope`和`launch`处理耗时任务,如网络请求,避免主线程阻塞。挂起函数和调度器控制执行上下文,适应不同任务需求。
|
5天前
|
移动开发 开发工具 Android开发
探索安卓与iOS开发的差异:平台特性与编程实践
【7月更文挑战第8天】在移动开发的广阔天地中,安卓和iOS这两大操作系统各自占据着半壁江山。它们在用户界面设计、系统架构及开发工具上展现出截然不同的特色。本文将深入探讨这两个平台在技术实现和开发生态上的关键差异,并分享一些实用的开发技巧,旨在为跨平台开发者提供有价值的见解和建议。
|
2天前
|
Java 开发工具 Android开发
探索Android与iOS开发的差异与挑战
【7月更文挑战第11天】在移动应用开发的广阔天地中,Android和iOS两大平台各领风骚。本文将深入探讨这两个平台的开发差异,从编程语言、用户界面设计到开发工具等方面进行比较,并分析开发者面临的挑战。通过对比分析,旨在为开发者提供一个全面的视角,帮助他们更好地选择适合自己项目需求的开发平台。
8 0
|
4天前
|
搜索推荐 Android开发 iOS开发
探索Android与iOS开发的差异:平台特性与用户体验的对比分析
【7月更文挑战第9天】在移动应用开发的浩瀚海洋中,Android和iOS两大操作系统如同两座灯塔,指引着开发者们的航向。本文将深入探讨这两个平台在开发环境、用户界面设计、性能优化以及市场策略上的根本差异。我们将通过比较分析,揭示各自平台的独特优势和潜在挑战,为开发者提供决策支持,同时也为用户体验的提升指明方向。
|
8天前
|
移动开发 Android开发 iOS开发
探索安卓与iOS开发的差异:平台选择对应用性能的影响
在移动开发的广阔舞台上,安卓与iOS这两大操作系统各据一方,引领着技术潮流与市场需求。本文深入探讨了这两个平台在开发过程中的关键差异,并分析了这些差异如何影响应用的性能和用户体验。通过对比分析,我们将揭示开发者在选择平台时应考虑的技术细节,以及这些选择如何塑造最终产品的命运。文章不仅为开发者提供了实用的指导,也为那些对移动开发感兴趣的读者提供了深刻的洞见。
|
8天前
|
安全 Linux 网络安全
部署07--远程连接Linux系统,利用FinalShell可以远程连接到我们的操作系统上
部署07--远程连接Linux系统,利用FinalShell可以远程连接到我们的操作系统上
|
8天前
|
Linux 虚拟化 数据安全/隐私保护
部署05-VMwareWorkstation中安装CentOS7 Linux操作系统, VMware部署CentOS系统第一步,下载Linux系统,/不要忘, CentOS -7-x86_64-DVD
部署05-VMwareWorkstation中安装CentOS7 Linux操作系统, VMware部署CentOS系统第一步,下载Linux系统,/不要忘, CentOS -7-x86_64-DVD
|
7天前
|
Linux 测试技术 数据安全/隐私保护
阿里云Linux os copilot 运维助手初体验
阿里云Linux os copilot 初体验
50 1
阿里云Linux os copilot 运维助手初体验