android 内存泄露笔记

来源:互联网 发布:工程优化设计收费标准 编辑:程序博客网 时间:2024/05/22 12:01

首先记住这两个地址:

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方法,清空messageQueueprivate 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);         //做一些自己的操作    }};


0 0
原创粉丝点击