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检查网络连接状态的变化,无网络时跳转到设置界面
  2. Github 上Top1的Android 异步网络请求框架
  3. android平台上的文件下载,文件和文件的操作
  4. 开启Android程序时检测网络与GPS是否打开
  5. Android 文件操作
  6. GreenDao —— 简单快速操作 Android SQLite 数据库

随机推荐

  1. android中关于Sqlite的问题
  2. 近百个Android优秀开源项目,覆盖Android开
  3. Android笔记之一:Hello, Android
  4. Android (shape,gradient)使用总结
  5. GridView的使用
  6. Android 文字倾斜
  7. Android——TextView指定字符串颜色高亮,
  8. android-scripting - Scripting Layer fo
  9. android判断动画已结束
  10. Unity3D在android下调试