Android StrictMode 处理ANR 性能优化<14>

为了防止APP可能出现的ANR问题,google引入StrictMode检查机制,有效预防app可能产生ANR的问题:

Android提供了一个叫做Strict Mode的工具,我们可以通过手机设置里面的开发者选项,打开Strict Mode选项,如果程序存在潜在的隐患,屏幕就会闪现红色。我们也可以通过StrictMode API在代码层面做细化的跟踪,可以设置StrictMode监听那些潜在问题,出现问题时如何提醒开发者,可以对屏幕闪红色,也可以输出错误日志

将API接口添加到APP程序中,可以想象,由于它是一种检测性工具,所以这部分测试代码就不需要release,所以在release的时候尽量不需要增加:

新建测试工程.

<1> 新建一个android测试工程如下:

Android StrictMode 处理ANR 性能优化<14>_第1张图片


<2> : 具体程序如下 

DurianApplication.java
package org.durian.durianstrictmode;

import android.app.Application;
import android.os.StrictMode;

/**
 * Project name : DurianStrictMode
 * Created by zhibao.liu on 2016/1/18.
 * Time : 19:10
 * Email [email protected]
 * Action : durian
 */
public class DurianApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        if(true){
            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                    .detectDiskReads()
                    .detectDiskWrites()
                    .detectNetwork()
                    .penaltyLog()
                    .build());

            StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                    .detectLeakedSqlLiteObjects()
                    .detectLeakedClosableObjects()
                    .penaltyLog()
                    .penaltyDeath()
                    .build());
        }

    }
}



DurianMainActivity.java
package org.durian.durianstrictmode;

import android.os.Bundle;
import android.os.StrictMode;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.w3c.dom.Text;

public class DurianMainActivity extends ActionBarActivity implements View.OnClickListener{

    private Button mButton;
    private TextView mText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        /*if(true){
            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
            .detectDiskReads()//检测磁盘读操作
            .detectDiskWrites()//检测磁盘写操作
            .detectNetwork()//检测网络写操纵
            .penaltyLog()//有情况打印log出来
            .build());

            StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                    .detectLeakedSqlLiteObjects()//检测数据库内存泄露
                    .detectLeakedClosableObjects()//检测对象的内存泄露
                    .penaltyLog()//顺便打一份log出来
                    .penaltyDeath()
                    .build());
        }*/

        super.onCreate(savedInstanceState);
        setContentView(R.layout.durian_main);

        mButton=(Button)findViewById(R.id.button);
        mButton.setOnClickListener(this);

        mText=(TextView)findViewById(R.id.text);


    }

    @Override
    public void onClick(View v) {
        int id=v.getId();
        switch (id){
            case R.id.button:

                for (int i=0;i<10000;i++){
                    try {
                        Thread.sleep(250);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                break;
            default:
                break;
        }
    }
}



mainfest文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.durian.durianstrictmode">

    <application
        android:name=".DurianApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".DurianMainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>






<3> : 测试的时候,先进入开发者模式下面,将"Strict  mode enable"开关打开.然后点击界面按钮.








其中里面如不过不想特别指定检查某一方面的,可以直接添加
.detectAll()
进去就好了.


不过上面的测试居然没有打出,可能需要换一个设备测试一下.














你可能感兴趣的:(Android StrictMode 处理ANR 性能优化<14>)