Android:StrictMode VmPolicy violation with POLICY_DEATH; android.os.NetworkOnMainThreadException

这几天使用countly,然后发现在android4.0以上的系统,打开app就闪退了。

看了一下error log:

11-25 19:14:29.637: E/StrictMode(13886): class com.xx.mrnst.android.guide.SplashActivity; instances=2; limit=1
11-25 19:14:29.637: E/StrictMode(13886): android.os.StrictMode$InstanceCountViolation: class com.xx.mrnst.android.guide.SplashActivity; instances=2; limit=1
11-25 19:14:29.637: E/StrictMode(13886): at android.os.StrictMode.setClassInstanceLimit(StrictMode.java:1)
11-25 19:31:45.215: E/ConnectionManager(14418): android.os.NetworkOnMainThreadException


上网找了一些解决方案:

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // 这里可以替换为detectAll() 就包括了磁盘读写和网络I/O
.penaltyLog() //打印logcat,当然也可以定位到dropbox,�?过文件保存相应的log
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects() //探测SQLite数据库操�? .penaltyLog() //打印logcat
.penaltyDeath()
.build()); 


这个StrictMode的设置其实不管用的,


关键问题是网络在主线程的优先级设置,如下所示:

if (android.os.Build.VERSION.SDK_INT > 9) {
   StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
   StrictMode.setThreadPolicy(policy);
}


问题解决了。


这个问题在android 官方的介绍也挺令人困惑的,它提示你请求http不要放在主线程里,其实我的程序基本上全在handler里去发起请求;

不过我还没有把全部handler全部使用AsyncTask 替换掉。


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风口猪炒股指标

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值