从This Handler class should be static or leaks might occur!警告说起

      对于接下来讨论的问题,首先需要弄明白一个问题就是什么是内存泄漏:一般来说内存泄漏有两种情况。一种情况如在C/C++ 语言中的,在堆中的分配的内存,在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉(如指针重新赋值);另一种情况则是在内存对象已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。第一种情况,在 Java 中已经由于垃圾回收机制的引入,得到了很好的解决。所以Java 中的内存泄漏,主要指的是第二种情况。        

      首先我们来理解这个警告(This Handler class should be static or leaks might occur),该警告是告诉我们内存会泄露,到底是怎么泄露的呢?!我们还是用个简单的例子来说明吧。

该图表示的是现在所报的警告

       现在我们用个实例来说明警告的具体解释是怎样的!

       首先我构建了一个内部类MsgHandler, 内部类实例保存了一个对其外部类实例的引用,你不需要通过new的方式生成一个,获得该引用的方法是MainActivity.this(即外部类名.this),并且该引用是强引用(这里就涉及到你需要去了解下java机制里面的引用中所涉及到的强引用,弱引用,以及随机引用的具体内容).

       其次是,当我使用MsgHandler实例的sendMessage方法的时候,会把消息发送到主进程的详细队列里面去,在sendMssage发送的消息里面包含对该MsgHandler实例的引用,所以主进程的消息队列里也就有了对MsgHandler实例的引用。

      如果出现这种场景就可能会内存泄露,当发送到消息队列的消息还没来得及处理,而此时MainActivity的已经不需要再使用了,调用finish()方法,来结束期生命周期,可此时在消息队列里还有一条消息没有处理,并且此条消息包含这个MsgHandler实例的引用,所以这个MsgHandler的实例还是可以触及的对象,所以其还不能被回收,又因为该MsgHandler实例包含了MainActivity 的强引用,所以其也不能被回收,就造成了内存泄漏。

解决该问题:通过弱引用的方式来解决该问题。

这里呢我们先通过该篇文章来解释下java的各种引用.

http://www.cnblogs.com/theo/p/6443493.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值