android开发中遇到的内存泄露(非大众版)
来源:互联网 发布:淘宝快递助手怎么开 编辑:程序博客网 时间:2024/06/11 20:12
http://www.cnblogs.com/leftwing/archive/2012/02/09/2343420.html
本来想早点睡觉的,这些天睡眠不足啊,弄这个内存泄露的问题压力太大了,但是还是先记录下来才能踏实 %><%
这几天被师父派了个处理内存泄露的任务。先说说状况,在eclipse中可以通过DDMS的heap来查看程序在内存中的占用情况。而我要处理的这个程序,每次运行后退出,都会使得allocated项增加0.1M,这样反复运行几百次之后,程序就会砰的一下,崩溃了---
于是就开始找问题。用到了一款工具——MAT,是用来分析内存问题的,这个网上一搜也一大堆,用法也一大堆,所以我就不多说了。以前没用过这个,不知道是这个软件自身功能的限制,还是我没摸透他的功能,反正通过mat只是找出来了一点点很笼统的提示,最大的问题之一就是MessageQueue有问题,那我就在偌大的工程中去找Message啊、Handler之类的相关代码吧。
一下子就花了三天的时间,因为实在是不知道在哪会出现什么样的问题,最后是通过自己写了几个小程序,模拟了一下Handler的几种用法,才发现的问题。正常用下来的话,handleMessage()基本上不会出什么问题;平常的用一下postDelayed()也不会出什么问题;但是postDelayed()嵌套就会有问题了。
先来个造成问题的代码(灰常的简单,只是为了演示一下问题):
1 package example.HandlerTest; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.os.Handler; 6 7 public class HandlerTest extends Activity { 8 9 Handler handler=new Handler();10 11 /** Called when the activity is first created. */12 @Override13 public void onCreate(Bundle savedInstanceState) {14 super.onCreate(savedInstanceState);15 setContentView(R.layout.main);16 17 handler.postDelayed(new Runnable() {18 19 @Override20 public void run() {21 // TODO Auto-generated method stub22 System.out.println(this.toString());23 24 //这里是问题的所在25 handler.postDelayed(this, 2000);26 }27 }, 2000);28 }29 30 }
在postDelayed()里面,重写的run方法中又有一个postDelayed(),这样就会造成程序返回或者activity关闭的时候,后台仍然会有一个线程在跑,上个效果图:
这是我运行两次后的输出结果,程序退出了,后台仍然有两个线程在跑,无法被释放,如果是大程序,就会导致:一、耗电;二、内存泄露。
解决方法:
在程序销毁的时候,要通过Handler的removeCallbacks(Runnable r)方法来手动释放掉该线程,当然要把Runnable单独提出来写,再来个修改后的代码:
1 package example.HandlerTest; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.os.Handler; 6 import android.view.KeyEvent; 7 8 public class HandlerTest extends Activity { 9 10 Handler handler=new Handler();11 12 /** Called when the activity is first created. */13 @Override14 public void onCreate(Bundle savedInstanceState) {15 super.onCreate(savedInstanceState);16 setContentView(R.layout.main);17 18 handler.postDelayed(handlerRunnable, 2000);19 }20 21 @Override22 protected void onDestroy() {23 // TODO Auto-generated method stub24 handler.removeCallbacks(handlerRunnable);25 super.onDestroy();26 }27 28 29 30 Runnable handlerRunnable=new Runnable() {31 32 @Override33 public void run() {34 // TODO Auto-generated method stub35 System.out.println(this.toString());36 37 handler.postDelayed(this, 2000);38 }39 };40 }
就不上效果图了。调用removeCallbacks()的时机是在一个activity退出的时候,一个类销毁的时候,这种情况都可以用onDestroy方法;再有就是可以在一个activity返回的时候,重写一下onKeyDown()方法,在里面remove。
以上就是我想记录下来的问题,还有一点,有个帖子提到了创建Message对象不能用new,而是要用Message.obtain()来创建,否则也会造成内存泄露。这一点我没验证过,不过官方的创建方法的确是obtain,没有用new的,这里也记录一下吧。
本人菜鸟,文笔和技术都还不过关,请多多指教~~~~~~~~ ^_^
- android开发中遇到的内存泄露(非大众版)
- Android内存泄露检测工具和实际开发中遇到的内存泄露问题解析
- android-内存溢出-子view未回收-非大众版
- Android教学中遇到的内存泄露和内存溢出
- android开发中内存泄露的原因
- Android开发常见内存泄露--非静态内部类引起的内存泄露
- android开发中,可能会导致内存泄露的问题
- 【转】android开发中,可能会导致内存泄露的问题
- android 开发中需要注意内存泄露的地方
- Android开发中应该避免的内存泄露
- android开发中,可能会导致内存泄露的问题
- android开发中,可能会导致内存泄露的问题
- Android开发,中可能会导致内存泄露的问题
- android开发中常见的规避内存泄露建议
- Android开发内存泄露之--Handler引起的内存泄露
- android开发过程中避免内存泄露
- Android开发过程中内存泄露检测
- Android开发过程中内存泄露检测
- 金山词霸竟然有错别字。
- 植物大战僵尸智慧树说的话
- cocos2d-x初探学习笔记(26)--其他(游戏存档,切换高清,图片处理)
- ssh2框架搭建
- 什么是MES系统
- android开发中遇到的内存泄露(非大众版)
- PHP5 php.ini中文解释
- 在TI-Omap3530上移植Android GingerBread 2.3.4
- VMware下设置IP和MAC地址详细(用于Ubuntu下上网)
- VMware虚拟机慢的问题
- linux下使用过的命令
- C++程序设计实验报告(四)
- Split View Controller在应用的中的若干问题及解决
- 表单客户端验证框架jsvalidation