Android开发发起HTTP请求时报NetworkOnMainThreadException问题求助
崩溃原因定位
直接从堆栈日志的最内层异常就能找到根本问题:android.os.NetworkOnMainThreadException。
你之前花时间调整的所有清单配置、网络安全配置全部正确,不存在逻辑错误:
- 已正确声明
INTERNET、ACCESS_NETWORK_STATE所需的网络权限 - 已开启明文流量访问,适配高版本API的网络限制
- 针对google.com配置的子域名放行规则,完全覆盖你测试请求的
www.google.com域名范围
从Android 4.0(API 14)开始,系统强制禁止在应用主线程(UI线程)上执行任何网络操作,一旦触发该规则就会直接抛出崩溃,和你做的这些网络配置没有任何关联。
修复方法
把网络请求逻辑从主线程移出到独立子线程执行即可,修改后的点击事件代码如下:
public void onClick(View view) { new Thread(() -> { try { URL url = new URL("http://www.google.com/"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 添加基础超时配置,避免无响应时阻塞线程 conn.setConnectTimeout(5000); conn.setReadTimeout(5000); conn.connect(); // 在此处添加后续业务逻辑 conn.disconnect(); } catch (IOException e) { e.printStackTrace(); } }).start(); }
新手注意事项
- 不要使用开启StrictMode宽松策略的方式绕开主线程网络检查做临时测试,这种方式会导致应用UI卡顿、触发ANR,属于调试专用的临时手段,不适合正式场景使用
- 如果后续需要在网络请求完成后更新界面控件,不能直接在子线程里操作UI,需要切回主线程完成控件更新
- 你使用的Android 9(API 28)系统,本身默认对明文流量的限制比API 30宽松,现有配置已经足够支撑你当前的测试需求,不需要再调整其他XML配置
内容的提问来源于stack exchange,提问作者obeda
相关产品推荐
相关产品推荐

