Handler内存泄露的改进(18)
2016-02-27 00:00
423 查看
摘要: Handler内存泄露问题:(退出程序时,Handler还持有外部类对象的引用,所以就算主Activity退出了,实际还没退出,还在运行,浪费内存)
解决方式: 1.定义一个内部类的时候,会默认持有外部类的引用,所以定义一个内部类的时候最好定义为静态内部类,因为静态不依赖于内部类的对象引用
2.使用弱引用 强应用(即我们经常new的对象的方式,它不会回收内存)》软引用(即没有内存时才去回收内存)》弱引用(即引用的对象不存在就得不到引用)
解决方式: 1.定义一个内部类的时候,会默认持有外部类的引用,所以定义一个内部类的时候最好定义为静态内部类,因为静态不依赖于内部类的对象引用
2.使用弱引用 强应用(即我们经常new的对象的方式,它不会回收内存)》软引用(即没有内存时才去回收内存)》弱引用(即引用的对象不存在就得不到引用)
//平时我们用以下这种写法会存在内存泄露 Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { if (msg.what == 1) { text_show.setText((String) msg.obj); } }; }; //所以为了改进这个,以下方式使用了弱引用的方式来声明,对上面的这种方法进行改进 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } // hangdler使用弱引用进行内存泄露优化 private final MyHandler handler = new MyHandler(this);//this代表了传入的Activity // 建一个静态内部类 private static class MyHandler extends Handler { // 弱引用对象 WeakReference<MainActivity> weakReference; // 定义一个构造函数,传入一个MainActivity public MyHandler(MainActivity activity) { weakReference = new WeakReference<MainActivity>(activity); } // 实现Handler里面的方法 @Override public void handleMessage(Message msg) { super.handleMessage(msg); // 通过软引用对到MainActivity对象进行引用 MainActivity activity = weakReference.get(); if (activity != null) {// 如果MainActivity没有退出,获取到的不是空你才进行下一步操作进行发送消息 } } } }
相关文章推荐
- 自己综合的一个常用下载和上传工具类:HttpClientUtils(18)
- 一个在ActionBar上显示图标和菜单PopupMenu的小示例(19)
- 在ActionBar显示ShareActionProvider分享文本,点击可以打开进行分享(19)
- ActionBar上显示自己自定义的一个SearchView(19)
- ViewPager的一个简单示例,这个比较乱(20)
- 第10课:底实战详解使用Java开发Spark程序学习笔记
- spring【7】(spring事务详解)
- 算法:回溯算法之九宫格
- WINDOWS API HOOK
- js keypress 对输入中文不响应
- 本地远程连接linux服务器的mysql数据库
- redmine数据备份
- redmine版本控制svn
- Netty精粹之TCP粘包拆包问题
- OC高效率52之理解NSCopying协议
- NIO总结
- Ubuntu Server Deploy 已经支持php7
- SSH协议介绍
- CentOS-6.5系统基础优化附带优化脚本
- centos ab使用