打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Android系列

StrictMode

      StrictMode最常用来捕捉应用程序的主线程,它将报告与线程及虚拟机相关的策略违例。一旦检测到策略违例(policyviolation),你将获得警告,其包含了一个栈trace显示你的应用在何处发生违例。除了主线程,我们还可以在Handler,AsyncTask,AsyncQueryHandler,IntentService等API中使用StrictMode。

检查策略

StrictMode的线程策略主要用于检测磁盘IO和网络访问,而虚拟机策略主要用于检测内存泄漏现象。Android已经在磁盘IO访问和网络访问的代码中已经加入了StrictMode。当监视的线程发生策略的违例时,就可以获得警告,例如写入LogCat,显示一个对话框,闪下屏幕,写入DropBox日志文件,或让应用崩溃。最通常的做法是写入LogCat或让应用崩溃。下面的代码展示了如何使用StrictMode的检查策略:

public void onCreate() {

         if (DEVELOPER_MODE){ 

               StrictMode.setThreadPolicy( newStrictMode.ThreadPolicy.Builder()                     .detectDiskReads() 

                    .detectDiskWrites() 

                    .penaltyDialog() 

                    .detectNetwork() // or .detectAll() for alldetectable problems

                     .penaltyLog().build());

              StrictMode.setVmPolicy( newStrictMode.VmPolicy.Builder()                                .detectLeakedSqlLiteObjects() 

                     .detectLeakedClosableObjects() 

                     .penaltyLog() 

                     .penaltyDeath().build());

          } 

         super.onCreate();

 }?

使用方法        

 如果不指定检测函数,也可以用detectAll()来替代。penaltyLog()表示将警告输出到LogCat,你也可以使用其他或增加新的惩罚(penalty)函数,例如使用penaltyDeath()的话,一旦StrictMode消息被写到LogCat后应用就会崩溃。具体支持的监视方法见:https://developer.android.com/reference/android/os/StrictMode.ThreadPolicy.Builder.htmlhttps://developer.android.com/reference/android/os/StrictMode.VmPolicy.Builder.html

        在正式版本中,我们并不希望使用StrictMode来让用户的应用因为一个警告而崩溃,所以在应用正式发布时,需要移出这些监视。你可以通过删除代码来实现,不过这里提供一个更好的方式来解决这个问题,即使用AndroidMainifest文件中的debuggable属性来实现,代码如下所示:

     android:debuggable="true"

        在代码中,使用方法如下所示:

     // Return if this application is not in debug mode      ApplicationInfo appInfo = context.getApplicationInfo();      int appFlags = appInfo.flags;      if ((appFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {        // Do StrictMode setup here            StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()                   .detectLeakedSqlLiteObjects()                   .penaltyLog()                   .penaltyDeath()                   .build()); 
}
暂停监测
如果在程序运行中无法避免的会违反StrictMode中的一些定义好的策略,而我们又希望能够暂时忽略这些策略的监视,我们可以使用permitXXXXX方法来暂停这些内容的监测,在做完需要忽略的监测之后,再起用监测,代码如下所示:
StrictMode.ThreadPolicy old = StrictMode.getThreadPolicy();StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder(old)        .permitDiskWrites()        .build()); //doSomethingWriteToDisk();StrictMode.setThreadPolicy(old);


 


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
严苛模式(StrictMode)
Android StrictMode使用
Android最佳实践之:StrictMode介绍
使用 TraceView 找到卡顿的元凶以及 StrictMode 优化代码逻辑
异常:android.os.NetworkOnMainThreadException
Android设计模式系列(12)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服