Android主线程里不允许网络操作
来源:互联网 发布:python爬百度文库 编辑:程序博客网 时间:2024/06/05 05:30
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主线程里不允许网络操作
- Android4.0 以后不允许在主线程进行网络连接
- Android4.0 以后不允许在主线程进行网络连接
- Android4.0 以后不允许在主线程进行网络连接
- Android 主线程无法访问网络
- Android 4主线程访问网络
- 解决Android主线程不能访问网络
- Android 4主线程访问网络
- android 4.0主线程访问网络问题
- android主线程访问网络出错
- Android 4主线程访问网络
- Android 4主线程访问网络
- android 4.0 主线程访问网络异常
- Android 4主线程访问网络 .
- android主线程访问网络的方法
- UI主线程里单独启一个子线程 -android
- android执行远程地址,就会报android.os.Net..... 这个原因是网络操作不能在主线程进行
- 避免主线程访问网络操作UI以及解析XMLDemo
- 《数字图像处理》冈萨雷斯学习笔记1:基本原理
- linux rootkit suterusu
- 【Cocos2d-x lua篇003】简单解析Lua的堆栈
- Android Journal
- BB10 点对点的向另一个NFC设备发NDEF消息
- Android主线程里不允许网络操作
- Android手机软件研发环境配置
- 【Cocos2d-x lua篇004】获取Lua表结构数据
- UITabBarController+UINavigationController多层嵌套
- HDU 1029 Ignatius and the Princess IV 【求众数】
- 【Cocos2d-x lua篇005】C++调用Lua的函数
- 在Ubuntu下怎么截图
- Linux系统调用
- 【Cocos2d-x lua篇006】Lua调用C++的函数