Android 7.0 android.os.NetworkOnMainThreadException

在Android 7.0设备上,一个原本正常运行的检测工具出现崩溃,原因是主线程进行了网络操作。Android从2.3开始禁止在主线程进行网络访问,但在4.X到6.X版本存在bug未抛出异常。Android 7.0修复了这个bug,导致执行TCP套接字写入操作的应用会抛出android.os.NetworkOnMainThreadException。为避免ANRs和界面卡顿,建议不在主线程进行网络操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        一前同事开发的一检测工具,手机需要通过网络与 PC 进行通信,之前一直用着很好,今天在一 Android 7.0 手机上进行使用的时候,每次必崩。崩溃日志显示  android.os.NetworkOnMainThreadException,查看崩溃处的代码,原来该处的 DataOutputStream.write() 放在了主线程中,因为 Android 在 2.3 之后就不允许在主线程中访问网络数据,否则会抛出 android.os.NetworkOnMainThreadException,所以才会崩溃,但是转念一想,之前使用过的其他4.X、5.X、6.X 的手机为什么没有抛此异常?后来在StackOverflow 上找到了答案:

Due to a bug in previous versions of Android, the system did not flag writing to a TCP socket on the main thread as a strict-mode violation. Android 7.0 fixes this bug. Apps that exhibit this behavior now throw an android.os.NetworkOnMainThreadException. Generally, performing network operations on the main thread is a bad idea because these operations usually have a high latency that causes ANRs and jank.

原来这是 Android 的一 Bug, 7.0 之前的 Android 版本未能将对主线程上的 TCP 套接字的写入操作举报为严格模式违反, 7.0(Android N) 修复了此错误。如果应用仍在主线程执行 TCP 套接字的写入操作会引发 android.os.NetworkOnMainThreadException。


一般情况下,我们不建议在主线程上执行网络操作,因为这些操作通常都有可能导致 ANR 和卡顿的高尾延迟。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值