android - Android OS 如何识别主线程上的网络调用并抛出 NetworkOnMainThreadException
问题描述
我正在尝试找到 AOSP 源代码的一部分,该部分负责保护在主线程上进行网络调用并NetworkOnMainThreadException
因此引发异常,但到目前为止我失败了。
那么Android如何识别主线程上的网络调用呢?它是否检查操作系统的某些网络组件(可能发生在硬件层?)是否被触摸?
感谢Michael Dodd的回答,我找到了引发异常的位置(您可以通过此搜索找到它)。现在的问题是谁以及何时调用该android.os.StrictMode.onNetwork()
方法。
解决方案
感谢 Michael Dodd 的回答,我发现它是如何工作的,例如对于 Android 8,有:
/**
* Resolves a hostname to its IP addresses using a cache.
*
* @param host the hostname to resolve.
* @param netId the network to perform resolution upon.
* @return the IP addresses of the host.
*/
private static InetAddress[] lookupHostByName(String host, int netId)
throws UnknownHostException {
BlockGuard.getThreadPolicy().onNetwork();
// ...
}
并且(感谢 Michael Dodd)在android.os.StrictMode中你可以找到:
// Part of BlockGuard.Policy interface:
public void onNetwork() {
if ((mPolicyMask & DETECT_NETWORK) == 0) {
return;
}
if ((mPolicyMask & PENALTY_DEATH_ON_NETWORK) != 0) {
throw new NetworkOnMainThreadException();
}
if (tooManyViolationsThisLoop()) {
return;
}
BlockGuard.BlockGuardPolicyException e = new StrictModeNetworkViolation(mPolicyMask);
e.fillInStackTrace();
startHandlingViolationException(e);
}
mPolicyMask
设置来自android.app.ActivityThread.java的PENALTY_DEATH_ON_NETWORK
via :android.os.StrictMode.enableDeathOnNetwork()
/**
* For apps targetting Honeycomb or later, we don't allow network usage
* on the main event loop / UI thread. This is what ultimately throws
* {@link NetworkOnMainThreadException}.
*/
if (data.appInfo.targetSdkVersion >= Build.VERSION_CODES.HONEYCOMB) {
StrictMode.enableDeathOnNetwork();
}
推荐阅读
- javascript - 如何在 Odoo 11 中通过 do_action() java-script 方法显示 action_id
- python - 有没有更简单的方法来删除数组中每个字符串前面的“-”
- ios - void函数中意外的非void返回值 - Swift 4(Firebase,Firestore)
- mysql - 操作存储在 mysql 文本列中的 Json 数据结构
- templates - Advanced Custom Fields not working for page template
- angular - 读取全局变量 Ionic
- python - 在代理后面使用 opensubtitles api Node.js/Python 包装器
- r - 调用时不显示现有值
- android - 使用 Retrofit 时安装 SSL 证书
- java - 如何格式化十进制数精度