StrictMode总结「建议收藏」

StrictMode总结「建议收藏」Android2.3提供一个称为严苛模式(StrictMode)的调试特性,Google称该特性已经使数百个Android上的Google应用程序受益。首先先整体介绍:StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder()//线程策略(ThreadPolicy).det

大家好,又见面了,我是你们的朋友全栈君。

Android 2.3提供一个称为严苛模式(StrictMode)的调试特性,Google称该特性已经使数百个Android上的Google应用程序受益。

首先先整体介绍:

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()//线程策略(ThreadPolicy)
                    .detectDiskReads()//检测在UI线程读磁盘操作
                    .detectDiskWrites()//检测UI线程写磁盘操作
                    .detectCustomSlowCalls()//发现UI线程调用的哪些方法执行得比较慢
                    .detectResourceMismatches()//最低版本为API23  发现资源不匹配
                    .detectNetwork() //检测在UI线程执行网络操作
                    .penaltyDialog()//一旦检测到弹出Dialog
                    .penaltyDeath()//一旦检测到应用就会崩溃
                    .penaltyFlashScreen()//一旦检测到应用将闪屏退出 有的设备不支持
                    .penaltyDeathOnNetwork()//一旦检测到应用就会崩溃
                    .penaltyDropBox()//一旦检测到将信息存到DropBox文件夹中 data/system/dropbox
                    .penaltyLog()//一旦检测到将信息以LogCat的形式打印出来
                    .permitDiskReads()//允许UI线程在磁盘上读操作
                    .build());
            StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()//虚拟机策略(VmPolicy)
                    .detectActivityLeaks()//最低版本API11 用户检查 Activity 的内存泄露情况
                    .detectCleartextNetwork()//最低版本为API23  检测明文的网络
                    .detectFileUriExposure()//最低版本为API18   检测file://或者是content://
                    .detectLeakedClosableObjects()//最低版本API11  资源没有正确关闭时触发
                    .detectLeakedRegistrationObjects()//最低版本API16  BroadcastReceiver、ServiceConnection是否被释放
                    .detectLeakedSqlLiteObjects()//最低版本API9   资源没有正确关闭时回触发
                    .setClassInstanceLimit(MyClass.class, 2)//设置某个类的同时处于内存中的实例上限,可以协助检查内存泄露
                    .penaltyLog()//与上面的一致
                    .penaltyDeath()
                    .build());

一 线程策略

detectDiskReads()/detectDiskWrites操作示例:

       StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                .detectDiskWrites()
                .detectDiskReads()
                .penaltyLog()
                .build());

        strictReads();
        
    }

    private void strictReads(){
        File file = new File(Environment.getExternalStorageDirectory().getPath()+"/note.txt");
        FileInputStream inputStream = null;
        int r = -1;
        try {
            inputStream = new FileInputStream(file);
            while((r = inputStream.read()) != -1){
                
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(inputStream != null){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

StrictMode总结「建议收藏」


detectCustomSlowCalls操作示例:

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                .detectCustomSlowCalls()
                .penaltyLog()
                .build());

        showCustomSlowCallFlag();
        showCustomSlowCall();

    }

    private void showCustomSlowCallFlag(){
        StrictMode.noteSlowCall("This is Andly");
        SystemClock.sleep(10002);
    }

    private void showCustomSlowCall(){
        SystemClock.sleep(10002);
    }

Log:(只有作了标记得才会打印log)

StrictMode总结「建议收藏」
detectResourceMismatches操作示例:

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                .detectResourceMismatches()
                .penaltyLog()
                .build());

        showResourceMismatches();

    }

    private void showResourceMismatches() {
        TypedArray ta = getResources().obtainTypedArray(R.array.icons);
        int a = ta.getInt(0,0);
    }

这个没有打印log,不知道为什么。。

detectNetwork操作示例:

  StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                .detectNetwork()
                .penaltyLog()
                .build());

        strictNetWork();
    }

    private void strictNetWork(){
        try {
            URL url = new URL("http://www.baidu.com");
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.connect();
            httpURLConnection.setRequestMethod("GET");
            httpURLConnection.setReadTimeout(3000);
            httpURLConnection.setConnectTimeout(5000);
            int code = httpURLConnection.getResponseCode();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }


log:

StrictMode总结「建议收藏」

对于线程策略剩下的比较简单就不多说,然后介绍一下:使用penaltyDropBox想要看文件得信息只需要输入:

adb shell dumpsys dropbox (这里写data/system/dropbox目录下文件的名字) –print

二 VM策略

detectActivityLeaks操作示例:

StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                .detectActivityLeaks()
                .penaltyLog()
                .penaltyDropBox()
                .build());


        new Thread(new Runnable() {
            @Override
            public void run() {
                SystemClock.sleep(1000);
            }
        }).start();
    }

log:

StrictMode总结「建议收藏」
log上面显示,实例创建了2个但是限制的是一个
detectLeakedClosableObjects操作示例:

StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                .detectLeakedClosableObjects()
                .penaltyLog()
                .penaltyDropBox()
                .build());

        leakedClosableObj();

    }

    private void leakedClosableObj() {
        File newxmlfile = new File(Environment.getExternalStorageDirectory(), "/note.txt");
        try {
            newxmlfile.createNewFile();
            FileWriter fw = new FileWriter(newxmlfile);
            fw.write("Andly");
            //fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


setClassInstanceLimit操作示例:

StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                .setClassInstanceLimit(LimitClass.class, 2)
                .penaltyLog()
                .penaltyDropBox()
                .build());

        classInstanceLimit();
    }

    private void classInstanceLimit() {
        classList.add(new LimitClass());
        classList.add(new LimitClass());
        classList.add(new LimitClass());
        classList.add(new LimitClass());
        classList.add(new LimitClass());
        classList.add(new LimitClass());
    }

log:

StrictMode总结「建议收藏」
detectLeakedRegistrationObjects操作示例:

StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                .detectLeakedRegistrationObjects()
                .penaltyLog()
                .penaltyDropBox()
                .build());

        leakeRegistion();
    }

    private void leakeRegistion() {
        receiver = new myReceive();
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.andly.broadcast");
        registerReceiver(receiver,filter);
    }

log:

StrictMode总结「建议收藏」
考虑倒关于版本兼容问题,因为按照上面的写法在2.3以下系统是没有问题的,但是在2.3以上的话,就会出错,所以应该采用以下方式来处理

try {
            Class clazz = Class.forName("android.os.StrictMode");
            ApplicationInfo info = getApplicationInfo();
            if((info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0){
                //可以使用严苛模式
            }else{
                //不可使用严苛
            }
        } catch (ClassNotFoundException e) {
            //StrictMode类不可用  用这种方法来判断是否再Android2.3以下
        }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/133510.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android activity的跳转动画,实现activity跳转动画的若干种方式

    android activity的跳转动画,实现activity跳转动画的若干种方式第一种:(使用overridePendingTransition方法实现Activity跳转动画)在Activity中代码如下/***点击按钮实现跳转逻辑*/button1.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){/***在调用了startActivity方法之后…

    2022年5月21日
    32
  • 学习JavaScript这一篇就够了[通俗易懂]

    学习JavaScript这一篇就够了[通俗易懂]目录第一章JavaScript简介1.1、JavaScript的起源1.2、JavaScript的组成1.3、JavaScript的特点1.4、JavaScript的使用1.4.1、标签引用1.4.2、文件引用1.5、JavaScript的输出1.5.1、页面输出1.5.2、控制台输出1.5.3、弹出窗口输出1.6、JavaScript的注释1.6.1、单行注释1.6.2、多行注释第二章JavaScript基础语法2.1、标识符2.2、字面量和变量2.2.1、字面量2.2.2、变量2.3、数据类型2.3

    2022年6月16日
    28
  • ibm服务器如何装系统_ibm引导盘安装系统步骤

    ibm服务器如何装系统_ibm引导盘安装系统步骤小编了解到ibm服务器系统安装的方法是有别于安装其他品牌的服务器和台式机,而ibm笔记本一键启动u盘的快捷键是:F12;下面小编就把ibm服务器系统安装的方法讲解给大家听。首先需要准备的工具:两个大于4G的U盘,一个用来刻录IBM的官方引导镜像,一个用来刻录2008系统的镜像;软件方面,需要一个软碟通(UItralISO)软件。(上图是软件的图标,下图是软件打开的页面)1、打开软件后插入U盘,在软…

    2022年10月4日
    0
  • shell脚本——xsync

    shell脚本——xsyncxsync脚本基于rsync工具,rsync远程同步工具,主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点,它只是拷贝文件不同的部分,因而减少了网络负担。rsync-rvl$pdir/$fname$user@hadoop$host:$pdir常用参数:-r,–recursive对子目录以递归模式处理-R,–relativ…

    2022年5月31日
    55
  • Android之Activity生命周期浅析(一)「建议收藏」

    Android之Activity生命周期浅析(一)「建议收藏」Activity作为四大组件之一,出现的频率相当高,基本上我们在android的各个地方都能看见它的踪影,因此深入了解Activity,对于开发高质量应用程序是很有帮助的。今天我们就来详细地聊聊Activity的生命周期,以便我们在以后的开发中能如鱼得水。一、初识Activity  在日常应用中Activity是与用户交互的接口,它提供了一个用户完成相关操作的窗口。当我们在开发中创建Activit

    2022年8月16日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号