首先记住这两个地址:
https://yq.aliyun.com/articles/3009
http://www.cnblogs.com/qianxudetianxia/p/3645106.html
其次,实际检测时发现一个小坑:
如果一个Activity中存在一个未使用的EditText,并且这个EditText 使用了 requestFocus,则会出现内存泄漏。
代码如下:
View viewRoot = LayoutInflater.from(this).inflate(R.layout.new_layout, null); EditText edit1 = (EditText) viewRoot.findViewById(R.id.edittext1);
<EditText
android:id="@+id/edittext1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" >
<span style="color:#ff0000;"><requestFocus /> <!-- 这一句导致内存泄露 --></span>
</EditText>
还有,实际检测遇到的一个真实问题:
//在某个view中创建一个handler,这个mHandler使用的是主线程的looper
//本例的handler的作用是每隔五秒通知view做一些操作。
private Handler mHandler = new Handler();
//在view开始时调用startHandler,启动循环。
private void startHandler(){
mHandler.removeCallbacks(mRunTimeTick);
mHandler.postDelayed(mRunTimeTick, 1);
}
//在view结束时调用stopHandler方法,清空messageQueue
private void stopHandler(){
mHandler.removeCallbacks(mRunTimeTick);
}
//
private Runnable mRunTimeTick = new Runnable() {
@Override
public void run() {
//每隔五秒发一个message。
//注意!!!!此处会引发内存泄漏,原因是此处的消息没有使用本例的mHandler发出,
//而是使用view相关联的系统handler发出,因此,消息并不一定位于mHandler只有的messageQueue中。
//这时等view结束时调用的stopHandler就无法移出消息,造成内存泄漏。
//解决方法很简单,使用 mHandler.postDelayed(mRunTimeTick, 5000);
postDelayed(mRunTimeTick, 5000);
//做一些自己的操作
}
};