Android主线程里不允许网络操作
16lz
2022-01-14
Keywords: Android UI线程/主线程 PENALTY_DEATH_ON_NETWORK
Android API > 9 (Honeycomb及之后)版本里,对UI线程/主线程里是不允许联网操作的,如果有网络操作,会抛出NetworkOnMainThreadException的异常。
1. Thread Policy里对网络的限制
StrictMode.AndroidBlockGuardPolicy是BlockGuard.Policy的实现,在其onNetwork()方法里会根据Policy对网络操作检测:
public void onNetwork() {
if ((mPolicyMask & DETECT_NETWORK) == 0) {
return;
}
if ((mPolicyMask & PENALTY_DEATH_ON_NETWORK) != 0) {
throw new NetworkOnMainThreadException();
}
//...
}
主线程里的联网操作时会执行这里的onNetwork(),如果mPolicyMask里设置了PENALTY_DEATH_ON_NETWORK,NetworkOnMainThreadException异常就会被抛出。
而对mPolicyMask的PENALTY_DEATH_ON_NETWORK的掩码的使能操作,有两个方法:
StrictMode.ThreadPolicy.Builder().penaltyDeathOnNetwork()
StrictMode.enableDeathOnNetwork()
2. 使能主线程里的网络操作限制
从上面分析知道,主线程里的网络操作限制使能可以通过两个途径:
第一个StrictMode.ThreadPolicy.Builder().penaltyDeathOnNetwork(),只在StrictModeTest中被使用,tests编译时才会用到;
第二个StrictMode.enableDeathOnNetwork(),在ActiovityThread.handleBindApplication()中被使用:
if (data.appInfo.targetSdkVersion > 9) {
StrictMode.enableDeathOnNetwork();
}
在每个声明在sdk api-9以上的系统中应用,运行时都会被使能,也就是检测是否主线程中是否有联网操作,如果有联网操作就抛出NetworkOnMainThreadException异常。
Android API > 9 (Honeycomb及之后)版本里,对UI线程/主线程里是不允许联网操作的,如果有网络操作,会抛出NetworkOnMainThreadException的异常。
1. Thread Policy里对网络的限制
StrictMode.AndroidBlockGuardPolicy是BlockGuard.Policy的实现,在其onNetwork()方法里会根据Policy对网络操作检测:
public void onNetwork() {
if ((mPolicyMask & DETECT_NETWORK) == 0) {
return;
}
if ((mPolicyMask & PENALTY_DEATH_ON_NETWORK) != 0) {
throw new NetworkOnMainThreadException();
}
//...
}
主线程里的联网操作时会执行这里的onNetwork(),如果mPolicyMask里设置了PENALTY_DEATH_ON_NETWORK,NetworkOnMainThreadException异常就会被抛出。
而对mPolicyMask的PENALTY_DEATH_ON_NETWORK的掩码的使能操作,有两个方法:
StrictMode.ThreadPolicy.Builder().penaltyDeathOnNetwork()
StrictMode.enableDeathOnNetwork()
2. 使能主线程里的网络操作限制
从上面分析知道,主线程里的网络操作限制使能可以通过两个途径:
第一个StrictMode.ThreadPolicy.Builder().penaltyDeathOnNetwork(),只在StrictModeTest中被使用,tests编译时才会用到;
第二个StrictMode.enableDeathOnNetwork(),在ActiovityThread.handleBindApplication()中被使用:
if (data.appInfo.targetSdkVersion > 9) {
StrictMode.enableDeathOnNetwork();
}
在每个声明在sdk api-9以上的系统中应用,运行时都会被使能,也就是检测是否主线程中是否有联网操作,如果有联网操作就抛出NetworkOnMainThreadException异常。
更多相关文章
- android sim卡 TelephonyManager类:Android手机及Sim卡状态的获取
- android检查网络连接状态的变化,无网络时跳转到设置界面
- Android帧布局实现霓虹灯的效果
- 一张图看明白 Android(安卓)Handler 消息机制
- android google map apiKey 相关操作
- android平台上的文件下载,文件和文件的操作
- Github 上Top1的Android(安卓)异步网络请求框架
- android 快速移动sdCard的文件夹
- Android 文件操作