转载请标明出处:http://blog.youkuaiyun.com/blackzhangwei/article/details/51930852 谢谢!
先说说什么是内存泄漏?
内存泄漏是简单意义来讲就是长生命周期对象引用短生命周期的对象,导致GC无法回收,会一直占用内存。那么就有可能导致内存溢出
内存泄漏最终会导致内存溢出,程序就崩掉了,没有正确的使用handler就会导致这样的问题发生
比如:当A对象,被B对象所引用,当B对象没有释放时,A对象不能被回收(A短B长),A对象可能造成内存泄漏
什么是内存溢出?
当一个程序内存泄漏过多或者内存不足时,程序会发生内存溢出,导致程序异常中断(崩溃)
解决内存泄漏来防止内存溢出正确的使用方法:
(1).在编写代码时一定要注意是否存在内存泄漏问题
(2).测试项目可以使用内存泄漏的检查工具
在处理Handler的内存泄漏方法:
(1).在结束Activity时候,删除所有回调和消息处理
handler.removeCallbacksAndMessages(null);
(2).定义为静态handler,因为静态不会依赖外部类对象,就会依赖类,所以activity就可以任意被回收
(是否用静态:就得考虑该对象是否长期占用activity)
(3).使用软引用或者弱引用,通过构造方法传递进来的activity利用弱引用来处理
强引用>软引用>弱引用>虚引用
StrongReference强引用:
直接new 出来的都叫强引用,内存不足时宁可抛出异常也不会去回收它
WeakReference弱引用:在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存,
(如果这个对象是偶尔的使用,并且希望在使用时随时就能获取到,但又不想影响此对象的垃圾收集,那么你应该用 Weak Reference 来记住此对象)
SoftReference软引用:
当内存不足的时候,那么GC就直接把软引用对象回收掉,只要垃圾回收器没有回收它,该对象就可以被程序使用(软引用可用来实现内存敏感的高速缓存)
PhantomReference虚引用:
如果对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收(一般很少使用)
关于强弱引用详解传门:http://blog.youkuaiyun.com/mazhimazh/article/details/19752475
↓下面是利用软引用+静态方式handler使用获取验证码案列↓
//*:额外加的详细说明,可以忽略
Main.xml
一个Button按钮,设置了点击事件,设置可点击(其实可以不用设,默认是可点击)
<?xml version="1.0" encoding="utf-8