防止handler内存泄漏
2016-05-21 13:54
260 查看
内存泄漏:程序运行会用到内存,在退出程序的时候,占用内存的数据没有释放,那么当数据越来越多的时候,就会产生内存泄漏。
handler为什么会内存泄漏呢,handler是个内部类,内部类会持有外部类的引用,内部类需要依赖外部类。handler需要定义为静态类,当你推出Activity,handler还在工作,
下面是引起内存溢出的:Activity已经finish,但handler还在工作
解决方法:用软引用并用静态内部类
handler为什么会内存泄漏呢,handler是个内部类,内部类会持有外部类的引用,内部类需要依赖外部类。handler需要定义为静态类,当你推出Activity,handler还在工作,
下面是引起内存溢出的:Activity已经finish,但handler还在工作
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myhandler.postDelayed(new Runnable() { @Override public void run() { System.out.println("存在"); } }, 1000*60*10); finish(); } private Handler myhandler=new Handler(){ public void handleMessage(android.os.Message msg) { }; }; }
解决方法:用软引用并用静态内部类
/** * * @author Administrator 定义一个内部类时,会默认引用外部类对象的引用,当使用内部类时,使用static定义为静态内部类 * 引用:强引用(new) 软引用,弱引用 */ public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); handler.postDelayed(new Runnable() { @Override public void run() { System.out.println("存在"); } }, 1000 * 60 * 10); finish(); } private myhanler handler=new myhanler(this); private static class myhanler extends Handler { WeakReference<MainActivity> activity; public myhanler(MainActivity main) { activity = new WeakReference<MainActivity>(main); } @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); if (activity.get()!= null) { } } } }
相关文章推荐
- Windows2012R2版本区别
- 如何给DropDownList控件设置样式(ASP.NET MVC)
- checkbox
- xcode插件 安装,与管理
- ubuntu 挂载 windows 共享文件
- js+html5实现canvas绘制椭圆形图案的方法
- dbg双机调试配置
- C语言知识体系框架
- MYSQL
- 从程序员到项目经理(2)【转载】
- 3种特殊总帐标志
- 查看oracle数据库的连接数以及用户
- 第十三周项目 4 立体类族共有的抽象类
- 自定义一个UITableViewHeaderFooterView、UITableViewCell需要注意的一些方法。
- Struts框架 action怎么动态调用方法
- mysql数据库安装与卸载
- Kernel Methods (1) 从简单的例子开始
- 邮件发送模型及其Python应用实例
- spring-boot之简单定时任务
- tab form