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异常。


更多相关文章

  1. android sim卡 TelephonyManager类:Android手机及Sim卡状态的获取
  2. android检查网络连接状态的变化,无网络时跳转到设置界面
  3. Android帧布局实现霓虹灯的效果
  4. 一张图看明白 Android(安卓)Handler 消息机制
  5. android google map apiKey 相关操作
  6. android平台上的文件下载,文件和文件的操作
  7. Github 上Top1的Android(安卓)异步网络请求框架
  8. android 快速移动sdCard的文件夹
  9. Android 文件操作

随机推荐

  1. Android应用程序四大组件
  2. android 控制屏幕亮度
  3. android实现自定义相机以及图片的水印
  4. Android中UI设计的一些技巧!!!
  5. Android通过OpenSL ES播放音频套路详解
  6. 【实习周记】Android(安卓)getevent.c源
  7. EditText中android:inputType="number"遇
  8. 【Android】实现动态显示隐藏密码输入框
  9. Android实现数据存储技术
  10. Android(安卓)Menu