#1. 背景介绍:
在系统monkey测试和案例测试中,我们在dropbox发现了大量的关于strictmode严苛模式的报错,为了增强系统稳定性,我们打算在项目初期就把这些类型的报错提给开发,来解决。对此本文写了StrictMode(VmPolicy)类型的demo以供大家粗粗略了解StrictMode。
#2. StrictMode 详解:
StrictMode 通过策略方式来让你自定义需要检查哪方面的问题。 主要有两中策略,一个时线程方策略- (ThreadPolicy),一个是VM方面的策略(VmPolicy)。
ThreadPolicy 主要用于发现在UI线程中是否有读写磁盘的操作,是否有网络操作,以及检查UI线程中调用的自定义代码是否执行得比较慢。
VmPolicy,主要用于发现内存问题,比如 Activity内存泄露, SQL 对象内存泄露, 资源未释放,能够限定某个类的最大对象数。
3. StrictMode(VmPolicy)默认检查的错误类型主要有以下五种可以自由组合:
.detectAll()
.detectActivityLeaks()
.detectFileUriExposure()
.detectLeakedClosableObjects()
.detectLeakedRegistrationObjects()
.detectLeakedSqlLiteObjects()
4.StrictMode(VmPolicy)Penalty 违规后的惩罚方式有以下三种可以自由组合:
.penaltyDropBox()
.penaltyDeath()
.penaltyLog()
5. 现写了上述检查的五种错误类型的demo,界面如下:
6. 下面介绍主要的代码:
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.IntentFilter;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.os.StrictMode;
import android.os.SystemClock;
import android.provider.Contacts;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContacts;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
@SuppressLint("HandlerLeak")
@SuppressWarnings("deprecation")
public class StrictModeDemo extends Activity implements View.OnClickListener {
private static final String TAG = "StrictModeActivity";
private static final boolean DEBUG_MODE = true;
private static final int MSG_GET_DATA_OK = 100;
private Context mContext;
private TextView mTextView;
private Button mCursorLeakButton;
private Button mClosableLeakButton;
private Button mActivityLeakButton;
private Button mRegistrationsLeakButton;
private Button mClassInstanceLimitButton;
private Thread mThread = null;
private TestStrictModeBroadcast mReceiver = null;
private List<ClassCounts> mClassList = new ArrayList<StrictModeDemo.ClassCounts>();
private static class ClassCounts{
/**No Content, Only used test!*/
}
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_GET_DATA_OK:
String result = (String) msg.obj;
if (TextUtils.isEmpty(result)) {
result = "抱歉,手机没有联系人!";
}
mTextView.setText(result);
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.