android.os.NetworkOnMainThreadException

Android之android.os.NetworkOnMainThreadException异常 今天用handler.post(Runnable);的时候出现了android.os.NetworkOnMainThreadException Runnable里面使用的访问网络请求,网络请求是不可以放在主线程里面的,所以出现了这个问题 因为我想执行 handler.post(runnable); Runnable runnable = new Runnable(){ S 阅读详情

2014-10-29 更新内容

代码中有网络请求,程序执行的时候LogCat报错如下:

android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork

有趣的是我偶然发现当我按照LogCat给出的android.os.NetworkOnMainThreadException去搜索的时候,大多数结果都是使用Thread线程操作。
而我按照第二条at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork搜索的时候,得到了不少用AsyncTask异步解决的结果。

原因:
Android在4.0之前的版本支持在主线程中访问网络,但是在4.0以后对这部分程序进行了优化,也就是说访问网络的代码不能写在主线程中了(也有网页上说是3.0)。

解决方法一:使用Thread
将请求网络资源的代码使用Thread去操作。在Runnable中做HTTP请求,不用阻塞UI线程。

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

Runnable runnable = new Runnable(){
    @Override
    public void run() {
        // TODO: http request.
        // 在这里进行 http request.网络请求相关操作  
        Message msg = new Message();
        Bundle data = new Bundle();
        data.putString("value","请求结果");
        msg.setData(data);
        handler.sendMessage(msg);
    }
}

解决方法二:使用AsyncTask

下面是google给的代码示例,出自AsyncTask。
我们把网络请求写在doInBackground()方法里就好了。

AsyncTask must be subclassed to be used. The subclass will override at least one method (doInBackground(Params...)), and most often will override a second one (onPostExecute(Result).)

AsyncTask的必须被继承使用。子类至少覆盖一个方法(doInBackground(参数...)),最经常将覆盖中的第二个方法是(onPostExecute(结果)。)

Here is an example of subclassing:

下面是一个子类的示例:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }

Once created, a task is executed very simply:

子类创建后用下面的代码执行:

new DownloadFilesTask().execute(url1, url2, url3);

Not all types are always used by an asynchronous task. To mark a type as unused, simply use the type Void:

并不是所有的参数总是被异步任务所使用,如果一个参数未使用,只需用Void代替:

private class MyTask extends AsyncTask<Void, Void, Void> { ... }

更多AsyncTask可以参看本博:AsyncTaskde 的使用

AsyncTask和Handler对比

至于哪个适合你的程序,看看下面的优缺点吧。

1 ) AsyncTask实现的原理,和适用的优缺点
AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.
使用的优点:

  • 简单,快捷
  • 过程可控

使用的缺点:

  • 在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来.

2 )Handler异步实现的原理和适用的优缺点
在Handler 异步实现时,涉及到 Handler, Looper, Message,Thread四个对象,实现异步的流程是主线程启动Thread(子线程)àthread(子线程)运行并生成Message-àLooper获取Message并传递给HandleràHandler逐个获取Looper中的Message,并进行UI变更。
使用的优点:

  • 结构清晰,功能定义明确
  • 对于多个后台任务时,简单,清晰

使用的缺点:

  • 在单个后台异步处理时,显得代码过多,结构过于复杂(相对性)

参考:

  1. [Android开发那点破事]解决android.os.NetworkOnMainThreadException
  2. Android之NetworkOnMainThreadException异常
  3. android.os.NetworkOnMainThreadException的解决方案
  4. AsyncTask

感谢原作者!

1.4 KFD 设备文件的获取与驱动握手协议 本文分析了OpenClose模块中libhsakmt与KFD内核驱动建立通信的过程。首先通过hsaKmtOpenKFD()函数打开/dev/kfd设备文件,建立用户态与内核态的通信通道。随后通过AMDKFD_IOC_GET_VERSION ioctl命令完成版本握手,确认双方的接口兼容性。KFD驱动采用Major.Minor二级版本号体系,当前主要版本为1,从1.1演进到1.19不断添加新功能。整个过程构成了用户态与内核态之间的"建连协议",是所有后续GPU操作的基础前提。 阅读详情

相关推荐

手把手教你解锁TI MSPM0G3507开发板(2025新版,附XDS110接线图)

本文详细解析了2025版TI MSPM0G3507开发板的解锁方法,针对新版硬件中BSL引脚的电路设计变化提供了精准接线方案和UniFlash软件配置步骤。通过实测数据和专业指导,帮助开发者解决芯片锁定问题,确保调试接口正常响应。

weixin_42696271的博客 807

Android错误笔记:android.os.NetworkOnMainThreadException

偶然编写一个程序时候出现下面这种错误: FATAL EXCEPTION: main Process: com.aiiage.baiduocrdemo, PID: 7128 android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwo...

shuaizhigen的博客 969

HALCON基于描述符的模板匹配(未标定)

HALCON基于不标定描述符的模板匹配

king_linj的博客 890

at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork

单词学习: Strict: adj.精确的; 绝对的; 严格的,严谨的; [植]笔直的 Block: n.块; 街区; 大楼,大厦; 障碍物,阻碍;  vt.阻止; 阻塞; 限制;  Guard: n.警卫; 狱吏,看守; 护卫队; 防护装置;  vt.保卫,守护; 看守; 加防护装置; 谨慎使用;  vi.警惕; 警卫; 

HAPP NEW JAVA 2138

SCS 43. 利用Scissor算法从单细胞数据中挖掘临床表型关联的细胞亚群

本文详细介绍了Scissor算法在单细胞转录组数据分析中的应用,该算法能够精准挖掘与临床表型关联的细胞亚群。通过建立单细胞RNA测序数据与临床预测模型的直接关联,Scissor避免了传统聚类方法的局限性,为疾病机制研究和个性化医疗提供了新工具。文章还涵盖了数据预处理、模型选择、结果验证等实战技巧。

weixin_28736335的博客 492

风光储互补微电网在偏远地区的应用实践:从建模到仿真全解析

本文深入解析了风光储互补微电网在偏远地区的应用实践,从系统设计到仿真建模全流程。通过Simulink等工具进行动态仿真,验证了系统在多种工况下的可靠性,并结合实际案例展示了其显著的经济和环保效益。文章为从业者提供了从技术路径到实施优化的全面指导。

weixin_29047545的博客 270

at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(错误

at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork( 这样的错误。可能是android系统版本的问题 在3.0以后,不允许在主线成中访问网络。

fay8048的博客 6510

[调参神器]使用VOFA+上位机进行PID调参(附下位机代码)

​ 简单地来说,VOFA+是一个超级串口助手,除了可以实现一般串口助手的串口数据收发,它还可以实现数据绘图(包括直方图、FFT图),控件编辑,图像显示等功能。​ 如果只是想要用VOFA+来进行数据绘图,直接使用一个波形图控件就行,但是如果想要把VOFA+当作一个长期使用的调参助手,我们最好设置一下控件。VOFA+简洁好用,但是又有点太简洁了,部分体验并不是很好(比如不能调整控件大小,保存文件不太方便等),所以如果学有余力,推荐自己用QT/PyQT写上位机。接下来,我们要将指令中的数据提取出来。

qq_56089182的博客 4万+

[Android开发错误解决]解决android.os.NetworkOnMainThreadException

在做一个博客App遇到一个错误,刚开始怎么都解决不了,因为代码没有问题但总是报错。最后查阅资料了解到,在Android 4.0以上,网络连接不能放在主线程上,不然就会报错android.os.NetworkOnMainThreadException。但是4.0下版本可以不会报错。下面是官方的解释        在Android4.0以后,会发现,只要是写在主线程(就是Activity)中的HTTP...

dazzlingN的博客 9万+

光模块的封装工艺有哪些?

COB封装传统的单路10Gb/s或25Gb/s速率的光模块采用SFP封装将电芯片和TO封装的光收发组件焊接到PCB板上组成光模块。但对于40G及以上速率的高速光模块,受激光器速率限制(多为25G),主要通过多通道并行实现,如40G由4×10G实现,而100G则由4×25G实现。蝶形封装:壳体通常为长方体,结构及实现功能通常比较复杂,可以内置制冷器、热沉、陶瓷基块、芯片、热敏电阻、背光监控,并且可以支持所有以上部件的键合引线。BOX封装属于蝶形封装的一种,用于多通道并行封装。

WaytoICT- Explore ICT Technology, Build Your Tech Path 3807

【Pytorch教程】:卷积神经网络 CNN

Pytorch教程目录 Torch and Numpy 变量 (Variable) 激励函数 关系拟合(回归) 区分类型 (分类) 快速搭建法 批训练 加速神经网络训练 Optimizer优化器 卷积神经网络 CNN 目录Pytorch教程目录什么是卷积神经网络 CNN卷积 和 神经网络池化(pooling)流行的 CNN 结构CNN 卷积神经网络MNIST手写数据CNN模型训练可视化训练全部代码 什么是卷积神经网络 CNN 卷积 和 神经网络 卷积神经网络是如何运作的呢, 举一个识别图片的例子, 我们知

nanke_4869的博客 8087

Android报错:android.os.NetworkOnMainThreadException

在Android 4.0以上,网络连接不能放在主线程上,不然就会报错android.os.NetworkOnMainThreadException。但是4.0下版本可以不会报错。 下面是官方的解释 在Android4.0以后,会发现,只要是写在主线程(就是Activity)中的HTTP请求,运行时都会报错,这是因为Android在4.0以后为了防止应用的ANR(Aplication Not Response)异常,Android这个设计是为了防止网络请求时间过长而导致界面假死的情况发生。 解决此问

shiGXW的博客 2万+

前程无忧Python岗位数据采集:基于API直连的高效招聘信息爬取实战

本文介绍了一个基于Python requests库的前程无忧招聘数据采集系统。项目通过分析API接口结构,配置完整的请求头和身份验证参数,实现了高效稳定的数据采集。系统支持多页数据批量获取,包含工作名称、薪资范围等关键字段的结构化解析,并将结果存储为Excel文件。技术实现涉及API分析、身份验证、请求头配置、数据清洗等关键步骤,同时强调遵守法律和道德规范。该系统可为求职者、HR和市场分析师提供有价值的行业数据支持,适用于市场分析、职业规划等场景。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 1552

安卓开发中的android.os.NetworkOnMainThreadException

开始进行安卓网络应用的学习 新建第一个app工程 在模拟器上运行时   遇到了android.os.NetworkOnMainThreadException   该异常是下面这句代码引发的 代码中新建一个socket Socket socket = new Socket("192.168.1.88", 9000);   我想可能是android版本问题 所以把manifest.x...

iteye_5401的博客 165

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

解决android socket编程出现的Caused by: android.os.NetworkOnMainThreadException错     本文转自:http://blog.csdn.net/debutent/article/details/8708127   以前我的socket通信的代码运行在android2.3.5手机上一点问题没有,现在入手了小米2S(系统andro

程序猿之洞 2999

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

android.os.NetworkOnMainThreadException异常如何解决

今天在用httpget从获取新浪微博获取sso授权用户信息时出现了 system err :android.os.NetworkOnMainThreadException. 后来搜索找到了答案:即在主线程访问了网络,这是不允许的 解决方案:把访问网络放在单独的线程中 new Thread(){ @Override public void run() {

0x5f3759df的专栏 1308

Android.os.NetworkOnMainThreadException异常的解决方式

笔者原以为,从后端的角度来讲,android和java客户端程序是大同小异的。 然而笔者有一次写一个爬取网页链接的小demo时,发现还是有不少区别的。 Android.os.NetworkOnMainThreadException异常产生的原因 Android4.0 以后不允许在主线程...

1112

android错误之android.os.NetworkOnMainThreadException

在做一个天气预报的widget的时候,参考了一个源代码,但是一直报错,就从里面抠出来获取天气的代码试试看,结果总是报错   就是这个异常,android.os.NetworkOnMainThreadException 代码是这样的: MainActivity: public class MainActivity extends Activity { MyWeather myWe

一个本科小生的奋斗史 7430

异常:android.os.NetworkOnMainThreadException

参考:http://hi.baidu.com/shangsong2009/item/7a5b9dfefb2caa5bc8f337fb 最近在学习android开发的视频,做到一个文件下载的程序。 下载网络上的数据时报出异常android.os.NetworkOnMainThreadException。 原来在android4.0以上的版本访问网络不能在主程序中进行,解决方法有2种,如下...

weixin_30621919的博客 239
上一篇: android:layout_weight的真实含义
下一篇: 如何在Eclipse和Android Studio中导入library project
十橙
博客等级 码龄24年 312粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值