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

来源:互联网 发布:练字很慢怎么办 知乎 编辑:程序博客网 时间:2024/06/05 01:19

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

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

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

新建测试工程.

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


<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 warden_sprite@foxmail.com * 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()
进去就好了.
不过上面的测试居然没有打出,可能需要换一个设备测试一下.





0 0
原创粉丝点击